2023. 6. 15. 16:12ㆍJava/객체지향
1. 선언위치에 따른 변수의 종류
1) 인스턴스변수
- 클래스 영역에서 선언되며 클래스의 인스턴스를 생성할 때 만들어진다.
- 인스턴스마다 고유한 상태를 유지해야하는 속성의 경우 인스턴스 변수로 선언한다.
- 인스턴스, 객체, 참조 변수
2) 클래스변수
- 클래스 영역에서 선언되며 클래스를 생성할 때 만들어진다.
- 모든 인스턴스가 공통된 저장공간(변수)을 공유하게 된다.
- 인스턴스변수 앞에 static을 붙인다.
- '클래스이름.클래스변수'와 같은 형식으로 사용
- 클래스, static, 공유 변수
3) 지역변수
- 메서드 내에서 선언되어 메서드 내에서만 사용 가능하다.
- 클래스의 멤버변수는 기본값으로 자동 초기화되는 반면 지역변수는 자동초기화가 이루어지지 않음
2. 클래스변수와 인스턴스변수
- 인스턴스변수는 인스턴스가 생성될 때마다 생성되므로 인스턴스마다 각기 다른 값을 유지할 수 있지만,
- 클래스 변수는 모든 인스턴스가 하나의 저장공간을 공유하므로 항상 공통된 값을 갖는다.
3. 메서드
- 메서드(method)
특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것.
기본적으로 수학의 함수 처럼 어떤 값을 입력하면 이 값으로 작업을 수행하여 결과를 반환한다. (그러나 함수와 달리 입력값 또는 출력값은 없을 수 있다.)
- 메서드를 사용하는 이유
> 높은 재사용성
> 중복된 코드의 제거
> 프로그램의 구조화
4. 메서드의 선언과 구현
접근제한자 리턴타입 메서드이름 (형식매개변수타입 변수명, ..) {
// 메서드 내부에서 처리할 내용들
// 리턴타입은 반환값이 있는 경우에는 반환 데이터타입을 표시, 없는 경우에는 void 표시
return 리턴값;
}
5. 메서드의 호출
메서드이름 (실매개변수, ..,);
6. return문
- 반환 타입이 void이면 생략가능
- 반환값은 변수, 수식계산결과, 상수 등이 가능하다
7. JVM의 메모리 구조
- 응용프로그램이 실행되면, JVM은 시스템으로부터 프로그램을 수행하는데 필요한 메모리를 할당받고
JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리한다
- 3가지 주요 영역
1) 메서드 영역
프로그램 실행 중 어떤 클래스가 사용되면, JVM은 해당 클래스의 클래스파일을 읽어서 분석하여 클래스에 대한 정보를 이곳에 저장한다. 클래스변수도 이 영역에 함께 생성된다.
2) 힙
프로그램 실행 중 생성되는 인스턴스는 모두 이곳에 생성된다. 인스턴스 변수도 여기에 생성됨
3) 호출스택
메서드의 작업에 필요한 메모리 공간을 제공한다. 메서드가 호출되면, 호풀 스택에 호출된 메서드를 위한 메모리가 할당되며 이 메모리는 메서드가 작업을 수행하는 동안 지역변수들과 연산의 중간결과 등을 저장하는데 사용된다.
그리고 메서드가 작업을 마치면 할당되었던 메모리 공간은 반환되어 비워진다.
8. 기본형 매개변수와 참조형 매개변수
- 기본형 매개변수 Call by value
변수의 값을 읽기만 할 수 있다 (Read only)
- 참조형 매개변수 Call by reference
변수의 값을 읽고 변경할 수 있다 (Read & Write)
원본 데이터에 영향O
9. 참조형 반환타입
- 반환 타입도 참조형이 될 수 있다
- 참조형 타입의 값은 객체의 주소이므로 정수값이 반환됨
- 즉, 반환 타입이 참조형이라는 것은 메서드가 객체의 주소를 반환한다는 것을 의미한다.
10. 재귀호출
- 재귀호출: 메서드 내부에서 메서드 자신을 다시 호출하는 것
- 재귀 메서드: 재귀호출하는 메서드
- 논리적 간결함 때문에 반복문 대신 재귀호출을 사용한다.
11. 클래스 메서드와 인스턴스 메서드
- 인스턴스 메서드
인스턴스 변수와 관련된 작업을 하는 메서드.
인스턴스 변수는 인스턴스를 생성해야만 만들어지므로 인스턴스 메서드 역시 인스턴스를 생성해야만 호출 할 수 있다.
- 클래스 메서드
인스턴스와 관계없는 메서드 (인스턴스 변수나 인스턴스 메서드를 사용하지 않는 메서드)
- 메서드 사용
1) 클래스를 설계할 때, 멤버변수 중 모든 인스턴스에 공통으로 사용하는 것에 static을 붙인다.
2) 클래스 변수는 인스턴스를 생성하지 않아도 사용할 수 있다. (클래스가 메모리에 올라갈 때 이미 자동으로 생성되므로)
3) 클래스 메서드는 인스턴스 변수를 사용할 수 없다.
4) 메서드 내에서 인스턴스 변수를 사용하지 않는다면, static을 붙이는 것을 고려한다.
12. 클래스 멤버와 인스턴스 멤버간의 참조와 호출
- 클래스 멤버 -> 인스턴스 멤버 호출
같은 클래스에 속한 멤버들 간에는 별도의 인스턴스를 생성하지 않고도 서로 참조 또는 호출이 가능하다.
단, 클래스 멤버가 인스턴스 멤버를 참조 또는 호출하고자 하는 경우에는 인스턴스를 생성해야한다.
인스턴스 멤버가 존재하는 시점에 클래스 멤버는 항상 존재하지만, 클래스 멤버가 존재하는 시점에 인스턴스 멤버가 존재하지 않을 수 있기 때문이다.
- 인스턴스 멤버 -> 인스턴스 멤버 호출
인스턴스 멤버간의 호출에는 아무 문제 없음.
하나의 인스턴스 멤버가 존재한다는 것은 인스턴스가 이미 생성되어 있다는 것을 의미하며, 즉 다른 인스턴스 멤버들도 모두 존재하기 때문이다.