
Java의 접근 제한자는 클래스, 변수(필드), 메소드, 생성자 등에 대한
외부 접근 권한을 제어하여 캡슐화와 정보 은닉을 구현하는데 사용된다.
public은 모든 패키지의 모든 클래스에서 접근할 수있다.
접근 제한을 두지 않고 가장 개방적인 접근 제한을 제공한다.
protected은같은 패키지 내의 클래스와 상속받은 하위 클래스에서 접근 할 수 있다.
💡 상속받은 하위 클래스는 같은 패키지가 아니라 다른 외부 패키지여도 접근이 가능하다.
접근 제한자를 명시하지 않으면, default 접근 수준이 적용된다.
default는 같은 패키지 내의 클래스에서만 접근할 수 있다.
private은 오직 같은 클래스, 자기 자신의 클래스 내에서만 접근할 수 있다.
외부 패키지, 외부 클래스나 하위 클래스에서 접근할 수 없다.
데이터 은닉을 위한 가장 제한적인 접근 권한이다.
클래스를 선언할 때 해당 클래스를 같은 패키지 내에서만 사용할 것인지(default),
다른 패키지에서도 사용할 수 있도록 할 것인지(public) 결정해야 한다.
클래스는 public, default 접근 제한을 가진다.
객체를 생성할 때 new 연산자로 생성자를 호출하는데,
생성자를 어디서나 호출할 수 있는 것은 아니다.
생성자가 어떤 접근 제한을 갖느냐에 따라 호출 가능 여부가 결정된다.
생성자는 public, protected, default, private 접근 제한을 가진다.
public class MyClass{
public MyClass(..){ }
protected MyClass(..){ }
MyClass(..){ }
private MyClass(..){ }
}
💡 생성자 호출 가능 여부는 객체 생성 여부를 의미한다.
public : 모든 패키지, 모든 클래스에서 생성자 호출 가능protected : 같은 패키지의 클래스, 다른 패키지의 자식 클래스에서 생성자 호출 가능default : 같은 패키지의 클래스에서만 생성자 호출 가능private : 오직 자신의 클래스 내부에서만 생성자를 호출 가능🪄 클래스는 public인데 생성자는 public이 아니라면 어따 써먹어..?
필드/메소드를 선언 시, 해당 필드와 메소드를 어디서 사용할 것인지에 따라
접근 제한자를 결정한다.
필드/메소드는 public, protected, default, private 모든 접근 제한자를 가질 수 있는데 일반적으로 필드는 private, 메소드는 public 접근 제한자를 갖는다.
이 관례는 클래스의 내부 상태를 외부로부터 보호해 데이터 무결성을 유지하고,
외부와의 상호작용을 방법을 정의한다.
객체 지향 프로그래밍에서 객체의 무결성을 유지하기 위해
객체의 필드는 외부에서 직접적으로 접근하는 것을 막고,
메소드를 공개해 외부에서 메소드를 통해 필드에 접근하도록 한다.
Getter(), Setter() 메소드는 필드의 값을 읽고 수정할 수 있도록 하게 한다.
Getter() : 클래스의 필드 값을 외부에서 읽을 수 있도록 필드의 값을 반환한다.Setter() : 클래스의 필드 값을 외부에서 수정할 수 있도록 필드 값을 설정한다.pulbic class Person{
private String name;
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
}
| 접근 제한 | 적용 대상 | 접근할 수 없는 클래스 |
|---|---|---|
| public | 클래스,생성자, 필드, 메소드 | 없음 |
| protected | 생성자, 필드, 메소드 | 자식 클래스가 아닌 다른 패키지에 소속된 클래스 |
| default | 클래스, 생성자, 필드, 메소드 | 다른 패키지에 소속된 클래스 |
| private | 생성자, 필드, 메소드 | 모든 외부 클래스(나만 가능) |
상속(Inheritance)는 객체 지향 프로그래밍의 핵심 개념 중 하나로
기존의 클래스를 재사용하여 새로운 클래스를 정의하는 방법이다.
상속을 통해 코드의 재사용성을 높이고, 객체 간의 계층 구조를 만들 수 있다.
상속은 extends 키워드를 사용하여 구현한다. - 자식 클래스 extends 부모 클래스
public class Parent {
// 부모 클래스의 필드
protected String name;
// 부모 클래스의 메서드
public void display(){
...
}
}
public class Child extends Parent {
// 자식 클래스의 추가적인 필드
private int age;
// 자식 클래스의 추가적인 메소드
public void showAge(){
...
}
// 자식 클래스에서 부모 클래스의 메소드 재정의
@Override
public void display(){
...새롭게 정의한 내용...
}
}
1. 코드 재사용
부모 클래스에서 이미 정의된 필드와 메소드를 재사용함으로써
코드의 중복을 줄이고, 유지보수성을 높이는데 도움이 된다.
2. 다형성(Polymorphism)
부모 클래스의 메소드를 재정의(Override)함에 따라 같은 메소드 호출이 상황에 따라 다르게 동작할 수 있다.
부모 클래스 타입의 참조 변수를 사용해도 자식 클래스에서 재정의된 메소드가 호출된다.
3. 단일 상속
자바에서는 단일 상속만 지원한다.
즉, 한 클래스는 오직 하나의 부모 클래스만 가질 수 있다.
다중 상속으로 인해 발생할 수 있는 복잡성과 모호성을 피하기 위함이다.
🪄 다중 상속이 필요한 경우 인터페이스를 사용해 구현한다.
오버로딩과 오버라이딩에 대해 알아보기
super와 super()에 대해 알아보기
1. private
private 접근 제한자를 사용하면, 해당 멤버는 클래스 내부에서만 접근 가능하다.
부모 클래스의 private 멤버는 자식 클래스에 상속되지만, 직접 접근할 수 없다.
자식 클래스는 getter(), setter() 메소드를 통해 간접적으로 접근할 수 있다.
2. default
접근 제한자를 명시하지 않으면, 해당 멤버는 default 접근 제한자를 가지며,
같은 패키지 내에서만 접근이 가능하며 다른 패키지에서는 접근할 수 없다.
자식 클래스가 다른 패키지에 있는 경우, 부모 클래스의 default 멤버에 접근할 수 없다.
💡 부모 클래스를 상속받은 자식 클래스에서 접근 제한을 더 강하게 재정의할 수 없다.
부모 메소드가 public인 경우 재정의하는 자식 메소드는 default나 private으로
수정할 수 없다.
단, 반대는 가능하다. 부모 메소드가 default인 경우 재정의하는 자식 메소드는
default나 public을 가질 수 있다.
1. final
final class
final 클래스는 상속될 수 없다. - 부모 클래스가 될 수 없다.
이를 통해 클래스의 동작을 고정하고, 하위 클래스에서 동작을 변경하는 것을 방지할 수 있다.
final method
final 메소드는 자식 클래스에서 오버라이딩할 수 없다.
부모 클래스의 메소드 구현을 변경하지 않도록 강제할 때 사용한다.
2. abstract
abstract class
abtrcat 클래스는 상속을 목적으로 만들어진 클래스로, 객체를 생성할 수 없다.
abstrcat클래스는 다른 클래스가 상속하여 구체적인 구현을 제공해야 한다.
abstrcat method
abstrcat 메소드는 구현이 없는 메소드로, 자식 클래스가 반드시 이 메소드를 구현해야 한다.
abstract 메소드는 absctract 클래스 내에서만 존재할 수 있다.
