[JAVA] 상속과 캡슐화

정동아·2023년 4월 25일
0

백엔드 부트캠프

목록 보기
11/41

상속

기존의 클래스를 이용해서 (재활용) 새로운 클래스를 작성하는 자바의 문법요소이다.
두 클래스를 상위, 하위로 나눠서 상위 클래스의 멤버를 하위 클래스에 공유하는거다.
하위 클래스는 상위 클래스가 가진 모든 멤버를 상속받는다.
-> 그래서 하위 클래스 멤버 개수는 언제나 상위 클래스보다 같거나 많다.

그리고 ~클래스에서 상속받았다 는 표현보다 '~클래스로부터 확장되었다'는 표현으로 사용한다.

상속은 코드를 재사용해서 적은 양의 코드로 새로운 클래스를 작성할 수 있어 코드의 중복을 제거할 수 있다.
또한 다형적 표현이 가능하다.

클래스를 상속하려면 클래스명 다음에 extends 상위 클래스명 을 사용한다.

class Person {

}

class Dancer extends Person {//이렇게 써서 상위 클래스인 Person 클래스로부터 확장된다)
 
 }

기억할 점은 자바의 객체지향 프로그래밍에서는 단일 상속만을 허용한다는 것이다.
-> 다중 상속은 허용되지 않는다.

상속처럼 클래스를 재사용할 수 있는 방법으로는 포함(composite) 이 있다.
클래스의 멤버로 다른 클래스 타입의 참조변수를 선언하는 것을 말한다.

클래스간 관계를 설정할 때 상속과 포함 관계 중 어떤 걸 사용할지는
클래스 간의 관계가 '~은 ~이다' 관계인지 '~은 ~을 가지고 있다' 관계인지 문장을 만들어서 생각하는 것이다.

  • 클래스는 ~을 가지고 있다 가 어색하지 않다면 포함 관계,
  • 클래스는 ~이다 문장에 자연스럽다면 ~클래스를 상위 클래스로 하는 상속 관계를 맺는 식으로 관계를 설정하면 된다.

상위 클래스의 객체나 생성자를 호출하려면 super을 사용한다.

  • super 키워드는 상위 클래스의 객체를,
  • super()는 상위 클래스의 생성자를 호출한다.

공통적으로 상위 클래스의 존재를 상정하며 상속 관계를 전제로 한다.

super() 메서드는 this()와 같이 생성자 안에서만 사용 가능하고, 반드시 첫줄에 와야한다.
모든 생성자의 첫 줄에 this()또는 super()이 선언되어야한다는 것을 기억하자

메서드 오버라이딩
상위 클래스로부터 상속받은 메서드와 동일한 이름의 메서드를 재정의하는 것을 말한다.
-> 상위 클래스에 정의된 메서드를 하위 클래스에서 메서드의 동작을 하위 클래스에 맞게 변경하고싶을 때 사용한다.

상위 클래스의 메서드를 오버라이딩하려면 3가지 조건을 만족해야한다.
1) 메서드의 선언부(메서드 이름. 매개변수, 반환타입)가 상위 클래스랑 일치해야한다.
2) 접근 제어자의 범위가 상위 클래스의 메서드보다 같거나 넓어야한다.
3) 예외는 상위 클래스의 메서드보다 많이 선언할 수 없다.

캡슐화

특정 객체안에 관련된 속성과 기능을 하나의 캡슐로 만들어 데이터를 외부로부터 보호하는 것을 말한다.
왜 캡슐화를 해야하나?

  • 데이터 보호
  • 내부적으로만 사용되는 데이터에 대한 불필요한 외부 노출을 방지

하기 위해서다.

패키지
패키지란 특정한 목적을 공유하는 클래스와 인터페이스의 묶음을 말한다.
-> 클래스들을 그룹 단위로 묶어 효과적으로 관리하기 위한 목적을 가지고 있다.

자바에서 패키지는 물리적인 하나의 디렉토리이고, 하나의 패키지에 속한 클래스나 인터페이스 파일은 모두 해당 패키지에 속해있다.
이 디렉토리는 하나의 계층 구조를 가지고 있는데, 계층 구조 간 구분은 . 으로 표현한다.
패키지가 있는 경우 소스코드의 첫 줄에 반드시 package 패키지 명이 표시되어야 하고, 만약 패키지 선언이 없으면 이름 없는 패키지에 속하게 된다.

// 패키지를 생성했을 때
package practicepack.test; // 패키지 구문 포함. 패키지가 없다면 구문 필요없음

public class PackageEx {

}

패키지를 클래스로 묶으면 클래스의 충돌을 방지해 주는 장점이 있다.
예로, 같은 이름의 클래스를 가지도 있더라도 각각 다른 패키지에 속해있다면 이름명으로 인한 충돌이 발생하지 않는다.

Import문
다른 패키지 내의 클래스를 사용하기 위해 사용한다.
일반적으로 패키지 구문과 클래스 문 사이에 작성한다.

//작성 방법
import 패키지 명.클래스 명; 또는 import 패키지 명.*; 



getter와 setter 메서드
Private 객체의 변수의 데이터 값을 추가하거나 수정하고 싶을 때 getter 와 setter 메서드를 사용한다.

  • setter 메서드는 외부에서 메서드에 접근하여 조건에 맞을 경우 데이터 값을 변경할 수 있게한다. 조건에 맞지 않으면 잘못된 값을 되돌려주는 역할을 하기도 한다.
    ex) 나이가 음수이면 리턴~ 이런식으로

  • getter 메서드는 이렇게 설정한 변수 값을 읽어오는데 사용한다. 값이 없는 경우에 대안되는 내용을 리턴하기도 한다.

이것들을 활용하면 데이터를 효과적으로 보호하면서도 의도하는 값으로 값을 변경해서 캡슐화를 보다 효과적으로 할 수 있다.

0개의 댓글