본문 바로가기
개념

[JAVA의 정석] Chapter06

by cook_code 2024. 9. 7.
반응형

교재 목차

Chapter06. 객체 지향 프로그래밍 1

 

Chapter06. 객체 지향 프로그래밍


 

1. 객체 지향이란?

1-1. 객체 지향 언어의 특징 

  • 코드의 재사용성이 높다.
  • 코드의 관리가 용이하다.
  • 신뢰성이 높은 프로그래밍을 가능하게 한다.

1-2. 클래스와 객체

  • 클래스의 정의 : 클래스란 객체를 정의해 놓은 것이다.
  • 클래스의 용도 : 클래스는 객체를 생성하는데 사용된다.

1-3. 변수와 메서드

  • 객체의 정의 : 실제로 존재하는 것, 사물 또는 개념
  • 객체의 용도 : 객체가 가지고 있는 기능과 속성에 따라 다름
  • 유형의 객체 : 책상, 의자, 자동차, TV와 같은 사물
  • 무형의 객체 : 수학공식 , 프로그램 에러와 같은 논리나 개념
변수의 종류
선언위치
생성시기(메모리 할당 시기)
클래스 변수
클래스 영역
클래스가 메모리에 올라갈 때
인스턴스 변수
클래스 영역
인스턴스가 생성될 때
지역 변수
클래스 이외의 영역(메서드, 생성자, 초기화블럭)
변수 선언문이 수행 되었을 때

 

인스턴스 변수는 인스턴스가 생성될 때 마다 생성되므로 인스턴스마다 각기 다른 값을 유지할 수 있지만,
클래스 변수는 모든 인스턴스가 하나의 저장공간을 공유하므로, 항상 공통된 값을 갖는다.

  • 멤버변수(클래스 변수와 인스턴스 변수)와 배열의 초기화는 선택적이지만, 지역 변수의 초기화는 필수적이다.
  • 메서드의 정의 : 특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것
  • 메서드를 사용하는 이유
    • 높은 재사용성
    • 중복된 코드의 제거
    • 프로그램의 구조화
 메서드의 선언(정의)
접근제어자 반환타입 메소드이름(매개변수) { //선언부
	//구현부
}

 

 

메서드의 구현(호출)

 

메서드이름(값1, 값2,...);

 

 

 

메서드 실행 흐름 

 

MyMath mm = new MyMath();   // 먼저 인스턴스를 생성한다.
long value = mm.add(1L, 2L);  // 메소드를 호출한다.

long add(long a, long b) {
	long result = a + b;
    return result;
}

 

 

⑴ main메서드에서 메서드 add를 호출한다.
인수 1L과 2L이 메서드 add의 매개변수 a, b에 각각 복사(대입)된다.

⑵ 메서드 add의 괄호{}안에 있는 문장들이 순서대로 수행된다.

⑶ 메서드 add의 모든 문장이 실행되거나 return문을 만나면,
호출한 메서드(main메서드)로 되돌아와서 이후의 문장들을 실행한다.

 

1-4. 객체와 인스턴스

  • 클래스로부터 객체를 만드는 과정 → 클래스의 인스턴스화
  • 어떤 클래스로부터 만들어진 객체를 → 그 클래스의 인스턴스

1-5. 객체의 구성요소

  • 속성(Property) : 멤버 변수(member variable), 특성(attribute), 필드(field), 상태(state)
  • 기능(Function) : 메서드(method), 함수(function), 행위(behavior)

참고, 인스턴스는 참조변수를 통해서만 다룰 수 있으며, 참조변수의 타입은 인스턴스의 타입과 일치해야 한다.

1-6. 클래스의 또 다른 정의

  • 데이터와 함수의 결합
    • 변수 : 하나의 데이터를 저장할 수 있는 공간
    • 배열 : 같은 종류의 여러 데이터를 하나의 집합으로 저장할 수 있는 공간
    • 구조체 : 서로 관련된 여러 데이터를 종류에 관계없이 하나의 집합으로 저장할 수 있는 공간
    • 클래스 : 데이터와 함수의 결합(구조체 + 함수)
  • 사용자 정의 타입
    • 프로그래밍 언어에서 제공하는 자료형 외에 프로그래머가 서로 관련된 변수들을 묶어 하나의 타입으로 새로 추가하는 것
    • 왜? 새로 클래스를 정의할까?
💕 인스턴스 변수
인스턴스 변수의 값을 읽어오거나 저장하려면 인스턴스를 먼저 생성해야 함
인스턴스 별로 다른 값을 가질 수 있으므로
각각의 인스턴스마다 고유의 값을 가져야할 때는 인스턴스 변수로 선언

💕  클래스 변수
클래스 변수는 인스턴스 변수에 static 만 붙여주면 됨.
클래스 변수는 모든 인스턴스가 공통된 값을 공유한 클래스의 모든 인스턴스들이
공통적인 값을 가져야할 때 클래스 변수로 선언 클래스가 로딩될 때 생성되어
(메모리에 딱 한번만 올라감) 종료 될 때 까지 유지되는 클래스 변수는 public을 붙이면 같은 프로그램 내에서
어디서든 접근할 수 있는 전역 변수가 됨.
인스턴스를 생성하지 않고 클래스이름, 클래스변수명 을 통해서 접근 가능

💕  지역 변수

메서드 내에서 선언되며 메서드 내에서만 사용할 수 있는 변수
메서드가 실행될 때 메모리를 할당 받으며 메서드가 끝나면 소멸

 

1-7. JVM 메모리 구조

 

자바 소스 파일은 자바 컴파일러에 의해서 바이트 코드 형태인 클래스 파일이 되고

이 클래스 파일은 클래스 로더가 읽어들이면서 JVM이 수행된다. JVM 메모리 구조란? (JAVA)

(1) Class Loader

JVM 내로 클래스 파일을 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈. 런타임 시에 동적으로 클래스를 로드한다. 

(2) Execution Engine

클래스 로더를 통해 JVM 내의 Runtime Data Area에 배치된 바이트 코드들을 명렁어 단위로 읽어서 실행.

최초 JVM이 나왔을 당시에는 인터프리터 방식이었기때문에 속도가 느리다는 단점이 있었지만

JIT 컴파일러 방식을 통해 이 점을 보완되었다.

JIT는 바이트 코드를 어셈블러 같은 네이티브 코드로 바꿈으로써 실행이 빠르지만 역시 변환하는데 비용이 발생하였다. 

이 같은 이유로 JVM은 모든 코드를 JIT 컴파일러 방식으로 실행하지 않고,

인터프리터 방식을 사용하다가 일정한 기준이 넘어가면 JIT 컴파일러 방식으로 실행한다. 

 

(3) Garbage Collector

Garbage Collector(GC)는 힙 메모리 영역에 생성된 객체들 중에서 참조되지 않은 객체들을 탐색 후 제거하는 역할.

이때, GC가 역할을 하는 시간은 언제인지 정확히 알 수 없다. 

 

(4) Runtime Data Area

JVM의 메모리 영역으로 자바 애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역.

이 영역은 크게 Method Area, Heap Area, Stack Area, PC Register, Native Method Stack로 나눌 수 있다.

 

- Method area

모든 쓰레드가 공유하는 메모리 영역입니다. 메소드 영역은 클래스, 인터페이스, 메소드, 필드, Static 변수 등의 바이트 코드를 보관.

 

- Heap area

모든 쓰레드가 공유하며, new 키워드로 생성된 객체와 배열이 생성되는 영역.

또한, 메소드 영역에 로드된 클래스만 생성이 가능하고

Garbage Collector가 참조되지 않는 메모리를 확인하고 제거하는 영역.

 

- Stack area

 

메서드 호출 시마다 각각의 스택 프레임(그 메서드만을 위한 공간)이 생성.

그리고 메서드 안에서 사용되는 값들을 저장하고, 호출된 메서드의 매개변수, 지역변수, 리턴 값 및 연산 시 일어나는 값들을

임시로 저장. 마지막으로, 메서드 수행이 끝나면 프레임별로 삭제한다. 

 

- PC Register

쓰레드가 시작될 때 생성되며, 생성될 때마다 생성되는 공간으로 쓰레드마다 하나씩 존재.

쓰레드가 어떤 부분을 무슨 명령으로 실행해야할 지에 대한 기록을 하는 부분으로 현재 수행중인 JVM 명령의 주소를 갖는다.

 

- Native method stack

자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역.

메서드 호출 스택 요약

  • 메서드가 호출되면 수행에 필요한 만큼의 메모리를 스택에 할당받는다.
  • 메서드가 수행을 마치고나면 사용했던 메모리를 반환하고 스택에서 제거된다.
  • 호출스택의 제일 위에 있는 메서드가 현재 실행 중인 메서드이다.
  • 아래에 있는 메서드가 바로 위의 메서드를 호출한 메서드이다.
 

 

class CallStackTest {
	public staic void main(String[] args) {
    	firstMethod();
    }
    static void firstMethod() {
    	secondMethod();
    }
    static void secondMethod() {
    	System.out.println("secondMethod()");
    }
}

 

1-8. 기본형 매개변수와 참조형 매개변수 ★★★

기본형 매개변수 : 변수의 값을 읽기만 할 수 있다.

참조형 매개변수 : 변수의 값을 읽고 변경할 수 있다.

1-9. 클래스 메서드와 인스턴스 메서드

 

클래스 메서드 : 인스턴스와 상관없는(인스턴스 변수나 인스턴스 메서드를 사용하지 않는) 메서드

인스턴스 메서드 : 인스턴스 변수와 관련된 작업을 하는, 즉 메서드의 작업을 수행하는데 인스턴스 변수를 필요로 하는 메서드

  • 클래스를 설계할 때, 멤버변수 중 모든 인스턴스에 공통으로 사용하는 것에 static을 붙인다.
  • 클래스 변수(static 변수)는 인스턴스를 생성하지 않아도 사용할 수 있다.
  • 클래스 메서드는 인스턴스 변수를 사용할 수 없다.
  • 메서드 내에서 인스턴스 변수를 사용하지 않는다면, static을 붙이는 것을 고려한다.

1-10. 오버로딩

한 클래스 내에 존재하는 같은 이름의 메서드라도, 매개변수의 개수 또는 타입이 다르면 여러 개 정의할 수 있는 것

※ overload : 과적하다, 많이 싣는다. → 하나의 이름에 여러 기능을 싣는다 정도로 이해

  • 오버로딩의 조건 : 메서드 이름이 같고, 매개변수의 개수 또는 타입이 달라야 함
  • 오버로딩의 장점 : 메서드 기능 예측 가능, 메서드 이름 절약

1-11. 생성자(Constructor)

인스턴스가 생성될 때 호출되는 인스턴스 초기화 메서드

  • 생성자의 조건 : 생성자의 이름은 클래스의 이름과 같아야 하고, 리턴 값이 없다.
1. 클래스이름() { ... }                  // 매개변수가 없는 생성자 선언

2. 클래스이름(인수1, 인수2, ...) { ... } // 매개변수가 있는 생성자 선언

 

  • 생성자 흐름

⑴ 연산자 new에 의해서 메모리(heap)에 Card 클래스의 인스턴스가 생성된다.

⑵ 생성자 Card() 가 호출되어 수행된다.

⑶ 연산자 new의 결과로, 생성된 Card 인스턴스의 주소가 반환되어 참조변수 c에 저장된다.

기본 생성자

자바는 생성자가 하나도 없으면 컴파일러가 자동적으로 기본 생성자를 만들어 컴파일한다.

클래스이름() {}

 

매개변수가 있는 생성자

생성과 동시에 매개변수 주입 → 간결하고 직관적인 코드

생성자에서 다른 생성자 호출하기

  • 생성자의 이름으로 클래스 이름 대신 this를 사용한다.
  • 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다.

인스턴스 생성 시 생각해볼 것

  1. 클래스 - 어떤 클래스의 인스턴스를 생성할 것인가?
  2. 생성자 - 선택한 클래스의 어떤 생성자로 인스턴스를 생성할 것인가?

멤버변수 초기화 방법 및 시기

  • 명시적 초기화 (Excplicit initialization)
  • 생성자 (Constructor)
  • 초기화 블럭 (Initialization Block)
    • 인스턴스 초기화 블럭 : 인스턴스 변수의 복잡한 초기화에 사용
      • 인스턴스가 생성될 때마다 각 인스턴스별로 초기화가 이루어진다.
      • 기본값 → 명시적 초기화 → 인스턴스 초기화 블럭 → 생성자
    • 클래스 초기화 블럭 : 클래스 변수의 복잡한 초기화에 사용
      • 클래스가 처음 로딩될 때 단 한 번만 초기화 된다.
      • 기본값 → 명시적 초기화 → 클래스 초기화 블럭

 

반응형

'개념' 카테고리의 다른 글

[JAVA의 정석] Chapter08 - 09  (0) 2024.09.08
[JAVA의 정석] Chapter07  (2) 2024.09.08
[JAVA의 정석] Chapter04 -05  (5) 2024.09.07
[JAVA의 정석] Chapter01 -03  (6) 2024.09.06
동아리 '공간감각' 자바 스터디  (3) 2024.09.06