🖤 제어자(modifier)
: 클래스, 변수, 메서드선언부에 사용 → 부가적 의미를 부여함
구분 | 제어자 |
---|---|
접근제어자 | public, protected, (default), private |
그 외 | static, final, abstract ••• |
class, 멤버 변수 및 메서드에 많이 사용
하나의 대상 → 여러 제어자 조합가능 ✅
접근제어자 → 네가지 중 하나만 선택사용 🚨
접근제어자를 가장 왼쪽에 둠
🖤 static
: class 멤버와 같이 공통적인 의미를 가짐
인스터스변수 → 하나의 클래스로부터 생성되어도, 각기 다른 값을 유지함
클래스변수(static 멤버변수) → 인스턴스에 관계없이 항상 같은 값 유지
static + 멤버변수, 메서드, 초기화블럭
→ 클래스에 관계된 것이기 때문에 객체생성 ❌ , 바로 사용가능 ✅
static 메서드는 객체를 생성하지 않고 호출이 가능하므로 속도향상에 도움
제어자 | 대상 | 의미 |
---|---|---|
static | 멤버변수 | - 모든 인스턴스에 공통적으로 사용하는 클래스변수 |
(= 클래스변수) | - 객체(인스턴스)를 따로 생성하지 않고 바로 사용가능 | |
- 클래스가 메모리에 로드될 때 생성됨 | ||
메서드 | - 객체(인스턴스)를 생성하지 않고 호출이 가능한 static 메서드 | |
(= static 메서드) | - static 메서드 내에서는 인스턴스멤버 사용불가 |
🖤 final
: 마지막의, 변경 불가한의 의미를 가짐
final + 변수
: 값 변경 불가능한 상수 ⛔️
final + 메서드
: 조상클래스로부터 상속받아 메서드내용을 자손에 맞게 변경하는 오버라이딩 불가능 ⛔️
final + 클래스
: 자신을 확장하는 자손클래스 정의 불가능 ⛔️
제어자 | 대상 | 의미 |
---|---|---|
final | 클래스 | - 확장(변경) 불가능한 클래스 |
- 다른 클래스의 조상이 될 수 없음 | ||
메서드 | - 변경될 수 없는 메서드 | |
- 오버라이딩 불가능 | ||
멤버, 지역변수 | - 값을 변경할 수 없는 상수 |
🖤 abstract
: 미완성된 메서드, 클래스를 의미함
메서드 선언부 ✅ + 메서드 구현부 ⛔️
실제 수행내용(구현부)가 없는, 미완성 메서드가 존재하는 미완성 클래스
미완성 설계도이므로 객체생성 불가능 🚨
제어자 | 대상 | 의미 |
---|---|---|
abstract | 클래스 | 클래스 내, 추상메서드가 선언되어 있음을 의미 |
메서드 | 선언부 ✅, 구현부 ⛔️ → 추상메서드임을 알림 |
🖤 접근제어자(access modifier)
: 멤버(변수, 메서드) 또는 클래스(+생성자) → 외부에서 접근하지 못하도록 제한하는 역할
접근제어자 | 제한범위 |
---|---|
private | 같은 클래스 내에서만 접근가능 |
(default) | 같은 패키지 내에서만 접근가능 |
protected | 같은 패키지 + 상속관계에 있는 (다른 패키지)자손클래스 접근가능 |
public | 접근제한 없음 |
실제로 명시 ❌
따로 접근제어자가 지정되어있지 않은 경우 → 자동지정 값
즉, 아무런 접근제어자도 붙어있지 않은 것을 의미함
🖤 캡슐화(encqpsulation)
: 접근제어자를 활용하여 멤버(변수, 메서드) 또는 클래스(+생성자) 데이터를 감추고 보호하는 개념
class 내부에 선언된 데이터를 보호하기 위해서
데이터유효성 유지
외부에서 주요데이터 변경방지
외부에서 불필요하거나, 내부적으로만 사용되는 부분을 감춤
class Time {
public int hour;
public int minute;
public int second;
}
Time time = new Time(); // 객체생성
time.hour = 25; // 데이터유효성 깨짐
class 멤버(인스턴스)변수 → public 선언
객체 생성 후, 멤버변수에 직접 접근하여 값을 변경해도 막을 방법이 없음 🚨
① 멤버변수 → private 선언
② 멤버변수 값을 읽고 변경할 수 있는 public 메서드 제공
③ public 메서드가 유효성검사 후, 멤버변수 값 변경하도록 유도
class Capsule {
// 멤버(인스턴스)변수 -> private 선언
private int age;
private String name;
// 접근제한없는 메서드 -> 멤버(인스턴스)변수 간접적접근 유도
public int getAge() { // 값 읽는 getter
return age;
}
public String getName() {
return name;
}
public void setAge(int age) { // 값 변경하는 setter
this.age = age;
}
// 공백확인(조건, 유효성검사)메서드
// Capsule 클래스 내에서만 사용 -> private 선언
private boolean checkName(String name) {
return name.length() > 0; // 만족하면 True 반환
}
public void setName(String name) {
this.name = checkName(name) ? name : "Null";
}
}
class Object6 {
public static void main(String[] args) {
// 객체생성
Capsule capsule = new Capsule();
// capsule.age; -> private라서 접근불가
// capsule.name; -> private라서 접근불가
// 직접접근이 아닌, 간접접근으로 해결 "메서드를 통한 접근"
capsule.setAge(22);
capsule.setName("mallang");
System.out.println("capsule.getName() = " + capsule.getName());
System.out.println("capsule.getAge() = " + capsule.getAge());
// 유효성검사 예외
capsule.setName("");
System.out.println("capsule.getName() = " + capsule.getName());
}
}
종류 | 메서드이름 | 의미 |
---|---|---|
Getter | get멤버변수명 | 멤버변수 값 읽음 |
Setter | set멤버변수명 | 멤버변수 값 설정 |
🖤 다형성(polymorphism)
- 여러가지 형태를 가질 수 있는 능력
- 한 type의 참조변수 → 여러 type 객체참조 가능
[조상클래스 type] 참조변수 = new [자손클래스 type 인스턴스]
조상타입 참조변수 ➡️ 자손타입 인스턴스 참조 ✅
자손타입 참조변수 ➡️ 조상타입 인스턴스 참조 ⛔️
두 class가 서로 상속관계이 있다는 전제하에 사용가능
다형성으로 참조된 객체는 조상으로부터 상속받은 멤버요소만 사용가능 ⭐️
class Mammalia {
// 포유류는 새끼를 낳고 수유를 한다
public void giveFeed() {
System.out.println("모유수유를 합니다");
}
public void giveBirth() {
System.out.println("새끼를 낳습니다");
}
}
class Whale extends Mammalia {
// 고래는 포유류이면서 바다에 살며 수영이 가능하다
// 자손클래스 메서드
public void swimming() {
System.out.println("수영을 합니다");
}
// 조상클래스(상속받은) 메서드 오버라이딩
@Override
public void giveFeed() {
System.out.println("고래는 모유수유를 합니다");
}
@Override
public void giveBirth() {
System.out.println("고래는 새끼를 낳습니다");
}
}
class Object7 {
public static void main(String[] args) {
// 조상타입 참조변수 -> 자손타입 인스턴스참조 가능
Mammalia mammalia = new Whale();
// 조상클래스로부터 상속받은 멤버만 사용가능
mammalia.giveFeed();
mammalia.giveBirth();
}
}