클래스의 필드, 생성자, 메서드에 대해 알아보자.
또한 클래스 내부에서 자신의 객체를 가리키는 this키워드와 자신의 다른 생성자를 호출하는 this() 메서드도 학습한다.
필드 ( Field )
필드는 '클래스에 포함된 변수'로, 객체의 속성값을 지정할 수 있다.
지역 변수는 '메서드에 포함된 변수'다.
즉, 필드와 지역 변수는 어떤 중괄호 안에 선언됐는지에 따라 구분할 수 있다. (선언 위치가 중요하다.)
가장 큰 차이점은 생성되는 메모리의 위치다.
필드 = Heap 메모리의 객체 내부
지역 변수 = 스택 메모리
스택 메모리에 있는 변수는 JVM이 자동으로 삭제하지만, 힙 메모리의 객체 안에 저장되는 필드는 객체가
사라지지 않는 한 절대로 삭제되지 않는다.
1. 필드
- 외부에서 객체를 사용할 때 지속적으로 사용되어야 하는 데이터.
- 접근지정자 주로 private
- instance field / static field 가 존재한다.
- 필드 사용은 항상 메소드를 통해서 사용하게끔 해라. ( Get Set )
2. 지역 변수
- 해당 메서드 안에서만 사용이 가능한 변수다.
생성자
- Default 기능 :
1. 객체등록 (생성자가 호출이 안 될경우 객체를 생성할 수 없다.)
2. 생성자를 명시적으로 만들지 않을 경우 Default 생성자를 제공해준다.
- 오버로딩이 가능하다. (객체를 다양하게 만들 수 있다.)
- 리턴타입이 없다.
- 반드시 클래스명과 동일한 이름으로 만들어야한다.
- 기능 :
1. 객체 생성 시 필드 초기화
2. 필드 시작 값을 정할 수 있다.
3. 접근지정자는 주로 public으로 사용한다.
(외부에서 사용이 용이하기 때문)
4. 생성자도 메서드처럼 오버로딩을 할 수 있다.
즉, 메서드처럼 생성자의 입력매개변수 자료형이나 개수에 따라 여러개의 생성자를 정의할 수 있다.
메서드
클래스의 기능에 해당하는 요소다.
메서드도 클래스의 맴버이므로 외부에서 메서드를 사용하려면 먼저 객체를 생성해야 한다.
ex) MethodExam me = new MethodExam();
me.메소드();
* 주요 기능
- public으로 주로 지정
- 외부에서 필드에 접근하는 목적
- 필드는 항상 메소드를 통해 접근해야 한다. Get / Set 을 사용한다.
- 클래스 내부에 있는 메서드 끼리는 객체를 생성하지 않고 서로를 호출할 수 있다. 같은 맴버이기 때문이다.
필드 또한 멤버이므로 객체를 생성하지 않고 필드를 사용할 수 있다.
다만, static 메서드는 static이 붙은 필드와 메서드만 호출할 수 있다.
* 함수 호출 방식 3가지
1. call by name // 함수 이름 호출
2. call by value // 값에 의한 호출 (기본 자료형의 값이 메서드의 지역 변수에 복사된다.)
3. call by reference // 참조에 의한 호출 (객체의 참조값이 전달돼 복사된다. 호출한 &된 메서드에서 동일한 객체를
쳐다보고 있기 때문에 객체의 값을 변경하면 값이 바뀌게 된다. )
* Static 메서드와 Instance 메서드
가장 큰 차이점은 "객체 생성 여부"이다.
1. Static (=Class) 메서드는 객체를 생성하지 않고 클래스명.메서드명 으로 호출이 가능하다.
- Instance Field 사용 불가
- Static Field 사용 가능
- 목적 : 모든 객체가 데이터를 공유하기 위해 사용한다.
2. Instance 메서드는 반드시 객체를 생성한 후에 호출 가능하다.
즉, 인스턴스가 반드시 존재해야만 사용할 수 있다.
- Static Field 사용 가능
- Instance Field 사용 가능
- 사용률 90% 이상
- tihs가 존재한다.
* Static 메서드를 사용하면 좋은 경우
1. 모든 인스턴스에 공통으로 사용하는 것에 Static을 붙인다.
= 모든 인스턴스에서 같은 값이 유지되어야 하는 변수는 Static을 붙여서 클래스 변수로 정의한다.
2. 메서드 내에서 인스턴스 변수를 사용하지 않을 경우 Static을 붙이는 것을 고려하자.
= 메서드의 호출시간이 짧아져 성능이 향상된다.
(인스턴스 메서드는 실행 시 호출 메서드를 찾는 과정이 추가적으로 필요하기 때문에 시간이 더 걸린다.
this 키워드와 this() 메서드
모든 메서드는 자신이 포함된 클래스의 객체를 가리키는 this라는 참조 변수가 있다.
this.를 생략하면 컴파일러가 자동으로 this.를 추가해주기 때문에 지금까지 클래스 내부에서 필드와 메서드를 그대로 사용할 수 있던 것이다. (지역변수는 맴버가 아니므로 this.가 자동으로 붙지 않는다.)
* this란?
- 객체를 구별해준다. -> 메모리 절약효과
-인스턴스 메서드의 첫번째 맴버변수로 항상 존재한다.
-사용만 가능하고 만들 수는 없다.
-효율적으로 insance를 관리할 수 있다.
* 자동이면 몰라도 되는거 아니냐?
꼭 사용해야 하는 경우가 있다.
1. 필드와 지역변수가 이름이 똑같을 경우
필드에 this.을 붙여줌으로서 지역변수와 필드를 구분할 수 있다.
2. 내 자신의 객체를 보내줘야 할 경우 다음과 같이 사용할 수 있다.
public MethodExam getObject(){
ruturn this;
}
3. 생성자에서 오버로딩된 또 다른 생성자를 호출할 때 사용
this() 메서드를 통해 각 생성자마다 중복되는 코드를 최소화 할 수 있다.
*조건1. 생성자의 내부에서만 사용할 수 있다.
*조건2. 생성자의 첫 줄에 위치해야 한다.
둘 중 하나라도 지켜지지 않으면 이클립스는 바로 오류를 발생시킨다.
참고문헌 : Do it 자바 완전 정복
'Java > 자바 이론' 카테고리의 다른 글
[Java] 자바 super 키워드 & super() 메서드 (0) | 2022.06.30 |
---|---|
[Java] 자바 클래스 상속의 장점과 특징 (2) | 2022.06.30 |
[Java] 클래스 관계 HAS-A (포함) / IS-A (상속) 정리 (2) | 2022.06.29 |
[Java] String 객체 특징 ( ==와 equals의 차이점 ) (1) | 2022.06.23 |
[Java] 자바 메모리 영역 Static, Stack, Heap (4) | 2022.06.23 |