※ 본문은 혼자 공부한 내용을 기록한 글입니다. 오개념이 있다면 댓글로 알려주세요!
[ 1 ] 클래스의 구성
클래스는 멤버(member)로 구성되는데, 멤버에는 필드(field), 메소드(method), 생성자(constructor)가 있다.
필드(field)라는 용어가 생소하여 더 공부해 보았는데, 필드는 결국 "클래스 전역에서 접근할 수 있는 변수"를 의미했다.
- 필드의 역할
(1) 객체의 고유 데이터를 저장한다. |
(2) 객체가 가져야 할 부품을 저장한다. |
(3) 객체의 현재 상태를 저장한다. |
- 필드 특징
(1) 필드 선언을 위해서는 [접근 지정자] [필드의 타입] [필드의 이름] 3가지를 정해줘야 한다. |
(2) 생성자와 메소드 밖에서 선언되어야 한다. (생성자, 메소드 내에서 생성된 변수는 로컬 변수이다) |
(3) 필드는 class의 멤버이므로 멤버 변수라고 불리며, 클래스 내 전역에서 사용되어 전역 변수라고도 한다. |
(4) 지역 변수와 달리 초기화하지 않아도 기본값으로 초기화된다. (ex. int = 0, String = NULL 로 초기화) |
[ 2 ] 클래스 멤버와 인스턴스 멤버
(1) 클래스 변수와 인스턴스 변수
- 클래스 변수: 모든 인스턴스가 같은 값을 가지도록 하는 변수이며, 인스턴스를 생성하지 않더라도 클래스에 직접 접근하여 해당 변수를 사용할 수 있다. 타입 앞에 "static"을 붙여 선언할 수 있다.
- 인스턴스 변수: 인스턴스마다 다른 값을 가질 수 있다.
class Calculator
{
static int base = 0;
int left;
int right;
public void set(int left, int right)
{
this.left = left;
this.right = right;
}
public void sum()
{
System.out.println(this.left + this.right + base);
}
}
public class Main {
public static void main(String[] args) {
Calculator c1 = new Calculator();
c1.set(10, 20);
c1.sum(); // 30 출력
Calculator c2 = new Calculator();
c2.set(20, 40);
c2.sum(); // 60 출력
Calculator.base = 10; // 클래스를 통해 직접 접근 가능
c1.sum(); // 30 + 10 = 40 출력
c2.sum(); // 60 + 10 = 70 출력
}
}
위 코드에서 static으로 선언된 base가 클래스 변수이고, left, right가 인스턴스 변수이다.
left와 right는 인스턴스 변수이므로 각 인스턴스 c1, c2가 30, 60이라는 상이한 sum값을 출력한 것을 확인할 수 있다.
이와 달리, base는 클래스 변수이므로 클래스를 통해 직접 접근이 가능하고, c1, c2 모든 인스턴스에 공통적으로 영향을 미침을 확인할 수 있다.
(2) 클래스 메소드
클래스 변수와 마찬가지로 클래스 메소드도 존재하며, 클래스 메소드도 인스턴스를 생성하지 않고 클래스를 통해 직접적으로 접근하여 사용할 수 있다. (마찬가지로 static으로 선언)
class Calculator2
{
public static void sum(int left, int right)
{
System.out.println(left + right);
}
}
public class Main {
public static void main(String[] args) {
Calculator2.sum(20, 30); // 클래스를 통해 직접 접근 가능 - 50출력
}
}
(3) 클래스 변수 및 클래스 메소드를 사용하는 이유
1) 인스턴스 내에서 변하지 않는 값이 필요한 경우 (이런 경우 final이 더 적합하긴 하다) |
2) 인스턴스를 생성할 필요가 없는 경우 |
3) 값의 변경 사항을 모든 인스턴스가 공유해야 하는 경우 |
[ 3 ] 주의할 점
(1) 인스턴스 메소드는 클래스 멤버에 접근할 수 있다.
(2) 클래스 메소드는 인스턴스 멤버에 접근할 수 없다.
인스턴스 변수는 인스턴스가 만들어지면서 생성되는 반면, 클래스 메소드는 인스턴스가 만들어지기 전에 이미 생성된 것이기 때문이다.
즉, 클래스 메소드가 인스턴스 멤버에 접근하는 것은 아직 존재하지 않는 인스턴스 변수에 접근하는 것과 같으므로 이는 가능하지 않다.
이것의 반대를 생각하면 (1)은 가능하다. 생성된 인스턴스가 이미 만들어진 클래스 멤버에 접근하는 것이기 때문이다.
[ 참고자료 ]
유튜브 생활코딩 "클래스 맴버, 인스턴스 맴버 1, 2, 3, 4편"
https://www.youtube.com/watch?v=FECD60d_PYA&list=PLuHgQVnccGMCeAy-2-llhw3nWoQKUvQck&index=75
'Programming > Java' 카테고리의 다른 글
[Java] 추상 클래스(abstract class)와 인터페이스(interface) (1) | 2022.08.11 |
---|---|
[Java] 패키지(Package) (0) | 2022.08.05 |
[Java] Overriding, Overloading (0) | 2022.08.04 |
[Java] 생성자 및 상속에서의 생성자 (0) | 2022.08.02 |
[Java] 제네릭(Generic) (0) | 2022.07.31 |