이 글은 남궁성 님의 Java의 정석 책을 바탕으로 정리한 글입니다.
클래스와 객체
인스턴스
· 클래스를 통해 생성된 객체
· 참조 변수를 통해서만 다룰 수 있다
둘 이상의 참조 변수가 인스턴스를 가리키는 것은 가능하지만
하나의 참조 변수가 여러 개의 인스턴스를 가리키는 것은 가능하지 않다
클래스
· 필드(field), 메서드(method), 생성자(constructor), 이너 클래스(inner class) → 멤버
public class ExampleClass {
int x = 10; //필드: 속성
void printX() {...} //메서드: 기능
ExampleClass {...} //생성자: 클래스의 객체 생성
class ExampleClass2 {...} //이너 클래스
}
· new 키워드와 생성자를 통해 클래스의 객체를 생성
· 해당 객체를 힙 메모리에 넣고 그 주소값을 참조변수에 저장
클래스명 참조_변수명 = new 생성자();
변수와 메서드
인스턴스 변수(iv): 독립적인 저장 공간
클래스 변수(cv): static, 공통된 저장 공간 공유, 인스턴스 생성하지 않고 사용, iv 사용 불가
- 힙 메모리: 객체가 없어지지 않는 한 절대로 삭제 X, 빈 공간 저장 불가
- 알아서 강제 초기화
- 메서드 내에서 인스턴스 변수를 사용하지 않으면 static을 붙이자
지역 변수(lv): 메서드 내에 선언되어 메서드 내에서만 사용 가능
- 스택 메모리: 한동안 사용하지 않으면 가상 머신이 삭제
- 초기화하지 않으면 오류
//바람직한 호출 방법
인스턴스 메서드: '참조변수.메서드이름()'
static 메서드: '클래스이름.메서드이름()'
매서드의 구현부를 작성할 때 매개변수의 유효성 검사는 중요하다 - return 0;
class Card { // 클래스 영역
String kind; // 인스턴스 변수
int number;
static int width = 100; // 클래스 변수(공유 변수)
static int height = 250;
void method() // 메서드 영역
{
int lv = 0; // 지역 변수
}
}
변수의 종류 | 선언 위치 | 생성 시기 |
클래스 변수 | 클래스 영역 | 클래스가 메모리에 올라갔을 때 |
인스턴스 변수 | 인스턴스가 생성되었을 때 | |
지역 변수 | 클래스 영역 이외의 영역 (메서드, 생성자, 초기화 블럭 내부) |
변수 선언문이 수행되었을 때 |
JVM의 메모리 구조
1. 메서드 영역: 클래스 사용 시 해당 클래스 파일을 분석 후 클래스 데이터를 이곳에 저장
그 클래스 변수도 이 영역에 함께 생성
2. 힙: 인스턴스 변수 생성 공간
3. 호출 스택: 메서드 작업에 필요한 메모리 공간
지역 변수(매개변수 포함), 연산의 중간 결과 저장
메서드 생명 주기와 일치
호출 스택의 제일 위에 있는 메서드가 현재 실행 중인 메서드(상위 메서드 이외는 대기 상태): LIFO
아래에 있는 메서드가 바로 위의 메서드를 호출한 메서드
기본형 매개변수 vs. 참조형 매개변수
read only & read, write (주소(리모컨) 자체를 넘겨 주므로)
반환 타입이 참조형이라는 것은 메서드가 객체의 주소를 반환한다는 것을 의미
오버로딩
한 클래스 내에 같은 이름의 메서드 여러 개 정의
1. 메서드 이름 동일
2. 매개변수 개수 or 타입 다르게
3. 반환 타입은 영향 없음
가변 인자: 메서드의 매개변수 개수 동적 지정 가능, 내부적으로 배열 이용, 가능하면 오버로딩 하지 않는다
public int hash(Object... values) {
...
}
생성자
인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메서드'
모든 클래스에는 반드시 하나 이상의 생성자 정의,
기본 생성자가 컴파일러에 의해 추가되는 경우는 클래스에 정의된 생성자가 하나도 없을 때이다.
this
인스턴스 자신을 가리키는 참조 변수
인스턴스의 주소 저장, 모든 인스턴스 메서드에 지역 변수로 숨겨진 채 존재
필드 = 내부 클래스의 지역 변수 이름이 같을 때 this를 붙이지 않으면 범위가 더 좁은 지역 변수로 인식한다
this(), this(매개변수)
1. 같은 클래스의 다른 생성자 호출 시 사용
2. 생성자 내부에서만 사용 가능
3. 생성자 첫 줄에 위치해야 한다
class Example {
public Example() {
System.out.println("Example의 기본 생성자 호출!");
}
public Example(int x) {
this();
System.out.println("Example의 두 번째 생성자 호출!");
}
}
Example의 기본 생성자 호출!
Example의 기본 생성자 호출!
Example의 두 번째 생성자 호출!
'Back-End > Java' 카테고리의 다른 글
예외 처리(exception handling) (0) | 2021.12.26 |
---|---|
객체지향 프로그래밍 Ⅱ (0) | 2021.12.16 |
배열(array) (0) | 2021.11.25 |
연산자(Operator) (0) | 2021.11.16 |
변수(variable) (0) | 2021.11.15 |
댓글