인스턴스 멤버와 클래스 멤버
멤버 = 필드 + 메서드
인스턴스 멤버 = 인스턴스 필드+ 인스턴스 메서드
클래스 멤버 = 클래스 필드+ 클래스 메서드
인스턴스 멤버란 ?
• 지금까지 배우면서 선언한 필드와 메서드는 인스턴스 멤버다
• 객체를 생성해야 사용할 수 있다
• 객체의 인스턴스 필드는 각각의 인스턴스 마다 고유하게 값을 가질 수 있다
클래스 멤버란?
• Java의 클래스 로더에 의해 메서드 영역에 저장되고 사용
• 클래스 멤버란 메서드 영역의 클래스와 같은 위치에 고정적으로 위치하고 있는 멤버를 의미
• 클래스 멤버는 객체의 생성 필요없이 바로 사용이 가능
지역변수란?
• 메서드 내부에 선언한 변수
• 메서드가 실행될때마다 독립적인 값을 저장하고 관리
• 메서드 내부에서 정의될때 생성되어 메서드가 종료될 때까지만 유지
코드로 알아보자
public class Main {
public static void main(String[] args) {
Main main = new Main();
// 메서드 호출 : main.getClass()
System.out.println("main.getClass() = " + main.getNumber());
System.out.println("main.getClass() = " + main.getNumber());
System.out.println("main.getClass() = " + main.getNumber());
}
public int getNumber() {
int number = 1; // 지역 변수
number += 1;
return number; // 메서드 종료되면 지역변수 제거됨
}
}
// 출력
//main.getNumber() = 2
//main.getNumber() = 2
//main.getNumber() = 2
Final 필드와 상수
• final은 최종적 이라는 의미
• final 필드는 초기값이 저장되면 해당값을 프로그램이 실행하는 도중에는 절대로 수정할 수 없다!
• 또한 final 필드는 반드시 초기값을 지정해야 한다!!
final String company = "GENESIS";
...
Car car = new Car();
System.out.println(car.company);
생성자를 통해 final 필드를 초기화 할 수 있다!
public class Car {
final String company;
public Car() {
this.company = "GENESIS";
}
}
상수
• 상수의 특징은 값이 반드시 한개이며 불변의 값을 의미
• 따라서 인스턴스마다 상수를 저장할 필요가 없다
static final String COMPANY = "GENESIS";
...
System.out.println(Car.COMPANY);
생성자
📌 생성자는 객체가 생성될 때 호출되며 객체를 초기화하는 역할을 수행
• 생성자는 반환 타입이 없고 이름은 클래스의 이름과 동일
• new 연산자에 의해 객체가 생성되면서 Car(); 즉, 생성자가 호출 된다
public Car() {} // 선언
. . .
Car car = new Car(); // 호출
접근 제어자
📌 제어자는 클래스, 변수, 메서드의 선언부에 사용되어 부가적인 의미를 부여해 준다
• 접근 제어자 : public , protected , default , private
• 그 외 제어자 : static , final , abstract
❗ 하나의 대상에 여러 개의 제어자를 조합해서 사용할 수 있으나, 접근 제어자는 단 하나만 사용 가능
📌 멤버 또는 클래스에 사용, 외부에서 접근하지 못하도록 제한
public : 접근 제한이 전혀 없다
protected : 같은 패키지 내에서, 다른 패키지의 자손클래스에서 접근이 가능
default : 같은 패키지 내에서만 접근이 가능
private : 같은 클래스 내에서만 접근이 가능
Getter 와 Setter
📌 외부에서 객체의 private 한 필드를 읽을 필요가 있을 때 Getter 메서드를 사용
• 자동차 클래스의 필드에 이처럼 private 접근 제어자로 지정한 필드가 있을 때
Getter 메서드를 통해 값을 가 져올 수 있다
• 메서드 이름의 규칙은 : get + 필드이름(첫 글자 대문자)
• 사용하는 방법은 인스턴스 메서드 호출과 동일
private double speed; // 자동차 속도 , km/h
private char gear = 'P'; // 기어의 상태, P,R,N,D
private boolean lights; // 자동차 조명의 상태
public String getModel() {
return model;
}
public String getColor() {
return color;
}
public double getPrice() {
return price;
}
📌 외부에서 객체의 private 한 필드를 저장/수정할 필요가 있을 때 Setter 메서드를 사용
• 자동차 클래스의 필드에 이처럼 private 접근 제어자로 지정한 필드가 있을 때
Setter 메서드를 통해 값을 저 장하거나 수정할 수 있다
• 메서드 이름의 규칙은 : set + 필드이름(첫 글자 대문자
• 사용하는 방법은 인스턴스 메서드 호출과 동일
private double speed; // 자동차 속도 , km/h
private char gear = 'P'; // 기어의 상태, P,R,N,D
private boolean lights; // 자동차 조명의 상태
public void setModel(String model) {
this.model = model;
}
public void setColor(String color) {
this.color = color;
}
public void setPrice(double price) {
this.price = price;
}
Getter = 읽기 Setter = 저장/수정!
오늘의 Tip
Q String.equlas() 비교시 NullPointerException 발생
A String.equals( ) 메서드 사용 시 반드시 앞쪽에 비교할 대상 문자가 오게 한다
Stirng.length() 메서드도 동일
안전하게 사용하고자 한다면 Objects.equals() , Optional 사용 방법도 있다
'TIL' 카테고리의 다른 글
TIL - 2024/05/17 (0) | 2024.05.17 |
---|---|
TIL - 2024/05/16 (0) | 2024.05.16 |
TIL - 2024/05/13 (4) | 2024.05.13 |
TIL - 2024/05/10 (0) | 2024.05.10 |
TIL - 2024/05/09 (0) | 2024.05.10 |