우와한 개발자

[Java] 객체지향프로그래밍 - 캡슐화, 상속, 접근제한자

by 우와한개발자

객체지향프로그래밍의 주요 특징으로는 추상화, 캡슐화, 상속, 다형성이 있다.

 

[ 캡슐화 Encapsulation ]

1. 캡슐화 / 은닉 이란?

  • 데이터와 해당 데이터를 다루는 메서드(함수)들을 하나의 단위로 묶는것
  • 내부 데이터를 외부로부터 숨기고, 외부에서는 정의된 특정 메서드를 통해서만 접근할 수 있도록 함. (데이터 보호 및 외부에서의 접근 제어)
  • 안정성과 유지보수성을 높이는데 도움이 됨
  • 일반적으로 클래스의 멤버변수를 private으로 선언하여 외부에서의 직접적인 접근을 제한하고 public으로 선언된 메서드를 통해 데이터를 조작하는 방식으로 구현

2. getter와 setter

  • 접근자 (accessor) : 멤버 변수의 값을 참조하는 메서드
    • setter : 변수의 값을 변경시키는 메서드 setXxx() 형태, 주로 public void
    • getter : 변수의 값을 가져오는 메서드 getXxx() 형태
    • setter, getter는 lombok 라이브러리 사용해서 코드

 

[ 상속 Inheritance ]

1. 상속이란

  • 기존 클래스를 확장하여 새로운 클래스를 이끌어내는것
  • 상속관계 : “is a 관계”를 만족하는 관계 (Sub Class is a Super Class)
  • 자바에서의 상속은 단일 상속만 지원
  • Object(.toString(), hashCode(), equals())는 최상위 클래스
  • extends 키워드를 이용하여 상속을 표현
  • 부모의 멤버(변수, 메서드)를 자식 클래스에서 사용
  • 생성자는 상속이 안됨
  • final클래스는 상속불가
  • abstract 클래스는 반드시 상속해서 사용
  • 실선의 닫힌 화살표로 표현. (자식 ⇾ 부모)
  • 일반화된 클래스는 부모클래스, 구체화된 클래스는 자식 클래스

 

2. 메서드 재정의 Overriding

  • 부모클래스로부터 상속받은 기능을 자식클래스에서 다시 정의해서 사용하는 것
  • 오버로딩 규칙
    • 상속관계
    • 선언부가 같아야 함 : 리턴타입, 메서드 이름, 파라미터
    • 접근제한자는 같거나 more public 해야함.
    • 부모에서 throws 하지 않은 새로운 예외는 throws 할 수 없음.
  • @Override 어노테이션 : 메서드를 재정의 할때 사용되며, 컴파일러에게 이 메서드가 부모 클래스의 메서드를 재정의하는 것임을 알려줌.
  •  
⚠️ 부모클래스와 자식클래스 크기? 
- 부모 클래스가 자식의 클래스가 더 크다. (ex 동물 ⊃ 호랑이)
-  자식 클래스가 부모클래스보다 필드가 더 많아서 크게 느껴질 수 있으나 크다기 보다는 구체적이라고 생각해야한다.

 

3. this와 super

1) this : 현재 객체(자기 자신)

  • this. : 동일 클래스 내의 변수 또는 메서드 참조 가능
  • this() : 자신의 생성자 호출

2) super : 현재 객체의 부모 객체

  • super. : 자식클래스에서 부모클래스의 변수 또는 메서드 참조 가능
  • super() : 부모클래스의 생성자 호출 (super()를 사용하지 않는 생성자는 자동으로 Object의 생성자인 super()를 호출함)
public class Person {
	private String name;
	private int age;
	
	public Person(String name, int age) {
		this.name=name;   // super() 생략됨 → Object의 생성자 호출
		this.age = age;
	};
}

public class Student extends Person {
	private String major; 
	
	public Student(String name,int age, String major) {
		super(name,age);
		this.major = major;
	}
}
⚠️this()와 super()는 같이 사용할 수 있을까?
- 같이 사용할 수 없음
- this()와 super()는 모두 생성자 코드블록의 첫 번째 줄에 위치해야하기 때문.

 

[ 접근제한자 ]

1. Access Level 제한자 (접근제한자)

  • public: 같은 패키지(package)가 아니어도 어느 클래스에서나 참조가능
  • protected: 같은 패키지 내의 모든 클래스, 상속 관계가 있는 하위 클래스에서 참조가능
  • package friendly: 같은 패키지 내의 클래스에서만 참조가능
  • private: 같은 클래스 내에서만 참조가능

 

2. 클래스다이어그램(UML)에서 접근제한자 기호

접근제한자 표시 기호 같은 클래스 같은 패키지 다른 패키지
(상속 관계)
다른 패키지
(비상속)
public + O O O O
protected # O O O X
(default)(package-private) ~ 또는 공백 O O X X
private - O X X X

 

접근이 제한될때 나타나는 에러 : not visible
선언된 변수가 없는 경우 나타나는 에러 : undefined

블로그의 정보

우와한개발자 님의 블로그

우와한개발자

활동하기