OOP: Object Oriented Programming
=> 객체를 만들고 객체들 간의 상호작용을 통해 특정 기능을 구성하는 프로그래밍 방법론
1. 상속
부모가 자식에게 특징을 물려주듯이 상위 클래스의 특징을 하위 클래스에게 물려주는 것
2. 캡슐화
데이터와 코드의 형태를 외부에서 알 수 없게 하고, 데이터의 구조와 역할, 기능을 하나의 캡슐 형태로 만드는 것
3. 다형성
하나의 객체가 여러가지 형태를 가질 수 있는 성질
4. 추상화
객체의 공통적인 속성과 기능을 추출하여 정의하는 것
이번 Section에서는 캡슐화, 다형성, 상속에 대해서는 다루지 않기 때문에 간단하게만 정리하고 넘어가겠다.
클래스: 객체를 정의한 설계도
객체(Object): 실재하는 어떤 대상
인스턴스(Instance): 클래스로 생성된 객체
인스턴스화(Instantiate): 클래스로부터 객체를 만드는 과정
1) 필드(변수)
: 클래스의 속성(변수)
2) 메서드
: 클래스의 기능
3) 생성자
: 클래스의 객체를 생성
4) 이너 클래스
: 클래스 내부의 클래스
✅ 클래스 맴버 = 필드 + 메서드 + 이너 클래스
public class ExampleClass {
int x = 10; // (1) 필드
void printX() {...} // (2) 메서드
ExampleClass() {...} // (3) 생성자
class ExampleClass2 {...} // (4) 이너 클래스
}
1) new 생성자()
: 인스턴스 생성, 주소값을 리턴
new
: 힙 메모리에 공간을 할당받아 주소값을 반환한 후(객체 생성), 생성자를 실행시킨다. 생성자()
: 생성자를 호출하여 인스턴스 변수들을 초기화2) 참조_변수 = new 생성자();
: 주소값을 참조변수에 저장
1) Person
클래스는 클래스 영역에 저장된다.
2) 참조 변수 p
는 스택 영역에 저장된다. 이때 p
는 힙에 저장되어 있는 객체의 주소값을 갖는다.
✅ 힙 영역은 실제 객체의 값이 저장되는 공간, 스택 영역은 참조 변수가 저장되는 공간
= 스택에 있는 참조 변수로, 힙 영역에 존재하는 객체를 다룬다.
3) 클래스 내부의 메서드(클래스 메서드, 인스턴스 메서드 둘 다)는 클래스 영역에 저장된다.
같은 클래스로 만드는 모든 객체는 동일한 메서드를 공유하기 때문에 클래스 영역에 저장해두고, 필요한 경우에 참조해서 사용한다.
4) 클래스 내부의 변수는 종류에 따라 저장되는 위치가 다르다.
public class Test{
private int iv; // 인스턴스 변수.
public static int cv; // 클래스 변수.
public void print(){
int lv; // 지역 변수.
}
}
iv, cv는 클래스 내부에 선언되어 있으므로 멤버 변수
cv는 static으로 선언되었으니 클래스 변수
이고, iv는 인스턴스 변수
lv는 메소드 내에 선언되었으므로 지역 변수
❓ lv도 결국 Test 클래스 내부에 있으니까 멤버 변수 아닌가?
💁♀️{}
로 둘러싸였으니 결국 지역 변수이다!
❓ 왜 지역변수는 직접 초기화를 해줘야 하는가?
💁♀️ 지역변수는 메서드 내에서만 사용되기 때문에 생명 주기가 짧다.
그러므로 매번 지역 변수를 0으로 자동 초기화하면 메모리 낭비가 심해진다.
❓ 멤버 변수는 왜 자동으로 초기화가 이뤄지나요?
💁♀️ 힙 메모리는 빈 공간이 저장될 수 없기 때문에
Java의 메모리(Runtime Data Area)는 다음과 같이 구성된다.
메서드 정보, 지역변수, 파라미터 값이 저장된다.
LIFO(Last In First Out) 구조
메서드가 호출되면 Method Frame
이 생성된다.
Method Frame
에는 해당 메서드의 매개변수, 지역변수, 리턴값 등의 정보들이 저장되어 있다.
이는 스택 영역에 저장되었다가, 모든 동작이 완료되면 삭제된다.