객체지향 프로그래밍 심화

Nak Jun Choi·2022년 11월 7일

상속(Inheritance)

상속이란?

  • 기존의 클래스를 재활용하여 새로운 클래스를 작성하는 자바의 문법 요소이다.
  • 상속 관계가 있는 클래스의 하위 클래스는 상위 클래스가 가진 모든 멤버를 상속받게 된다.
  • 상속은 코드를 재사용하여 보다 적은 양의 코드로 새로운 클래스를 작성할 수 있어 코드의 중복을 제거할 수 있다.
  • 다형적 표현이 가능하다.
  • 자바의 객체지향 프로그래밍에서는 단일 상속만을 허락한다.

포함 관계

  • 포함(Composite)은 상속처럼 클래스를 재사용할 수 있는 방법으로, 클래스의 멤버로 다른 클래스 타입의 참조변수를 선언하는 것을 의미한다.
  • 클래스 간의 상속관계를 맺어 줄 것 인지 포함 관계를 맨어 줄 것인지를 판단하는 기준은 "클래스 간의 관계가 '~은 ~이다(IS-A)' 관계인지 '~은 ~을 가지고 있다(HAS-A) 관계인지 문장을 만들어 생각해보는 것이다."

메서드 오버라이딩(Method Overriding)

  • 메서드 오버라이딩은 상위 클래스로부터 상속받은 메서드와 동일한 이름의 메서드를 재정의하는 것을 의미한다.
  • 메서드 오버라이딩의 조건
    • 메서드 선언부(메서드 이름, 매겨변수, 반환타입)이 상위클래스의 그것과 완전히 일치해야한다.
    • 접근 제어자의 범위가 상위클래스의 메서드보다 같거나 넓어야 한다.
    • 예외는 상위 클래스의 메서드보다 많이 선언할 수 없다.
  • 메서드 오버라이딩을 한 객체들은 상위 클래스 타입 하나로 선언이 가능하고, 예와 같이 간편하게 배열로 선언하여 관리할 수 있다는 장점이 있다.
// 배열로 한번에 관리하기

Vehicle[] vehicles = new Vehicle[] { new Bike(), new Car(), new MotorBike()};
for (Vehicle vehicle : vehicles) {
		vehicle.run();
}

// 출력값
Bike is running
Car is running
MotorBike is running

Super 키워드와 super()

  • super 키워드는 상위 클래스의 객체, super()는 상위 클래스의 생성자를 호출하는 것을 의미한다.
  • 공통적으로 모두 상위 클래스의 존재를 상정하며 상속 관계를 전제로 한다.
  • super은 상위 클래스의 멤버와 자신의 멤버를 구별하는 데 사용된다.
  • super()은 생성자 안에서만 사용이 가능하고, 반드시 첫 줄에 와야한다.

Object 클래스

  • Object 클래스는 최상위에 위치한 상위 클래스이다. 따라서 Object 클래스의 멤버들을 자동으로 상속받아 사용할 수 있다.
  • 자바의 모든 클래스는 Object 클래스로부터 확장된다.
class ParentEx {  //  컴파일러가 "extends Object" 자동 추가 

}

class ChildEx extends ParentEx {

}

캡슐화

캡슐화란?

  • 특정 객체 안에 관련된 속성과 기능을 하나의 캡슐로 만들어 데이터를 외부로부터 보호하는 것(정보 은닉 data hiding)을 말한다.
  • 데이터 보호의 목적.
  • 내부적으로만 사용되는 데이터에 대한 불필요한 외부 노출을 방지.
  • 자바에서 캡슐하기 위한 핵심 수단은 접근 제어자, getter와 setter 메서드가 있다.

패키지

  • 패키지란 특정한 공유하는 클래스와 인터페이스의 묶음을 의미한다.
  • 자바에서 패키지는 물리적인 하나의 디렉토리이고, 하나의 패키지에 속한 클래스난 인터페이스 파일은 모두 해당 패키지에 속해있다.
  • 계층 구조 간 구분은 점.으로 한다.
// 패키지를 생성했을 때
package practicepack.test; // 패키지 구문 포함. 패키지가 없다면 구문 필요없음

public class PackageEx {

}
  • 클래스의 충돌을 방지해주는 역할을 한다.

  • import문은 다른 패키지 내의 클래스를 사용하기 위해 사용한다.

package practicepack.test2; // import문을 사용하지 않는 경우, 다른 패키지 클래스 사용방법

public class PackageImp {
		public static void main(String[] args) {
			practicepack.test.ExampleImport example = new practicepack.test.ExampleImport();
		}
}
package practicepack.test2; // import문을 사용하는 경우

import practicepack.test.ExampleImp // import문 작성

public class PackageImp {
		public static void main(String[] args) {
			ExampleImp x = new ExampleImp(); // 이제 패키지명을 생략 가능
		}
}
  • import 패키지명.* 키워드를 써주면 해당 패키지의 모든 클래스를 패키지명 없이 사용가능하다.

접근 제어자

  • 접근 제어자를 통해 외로부터 데이터를 보호하고, 불필요하게 데이터가 노출되는 것을 방지 할 수 있다.

  • 클래스, 필드, 메서드, 생성자 등에 부가적인 의미를 부여하는 키워드를 의미한다.

  • 자바에서 제어자는 크게 접근 제어자와 기타 제어자로 구분된다.

    • 접근 제어자 : public, protected, (default), private
    • 기타 제어자 : static, final, abstract, native, transient, synchronized 등
  • 하나의 대상에 대해서 여러 제어자를 사용할 수 있다.

  • 하지만, 각 대상의 접근 제어자는 단 한번만 사용할 수 있다.

  • 접근 제어자 (Access Modifier)

접근 제어자접근 제한 범위
private동일 클래스에서만 접근가능
default동일 패키지 내에서만 접근가능
protected동일 패키지 + 다른 패키지의 하위클래스에서 접근 가능
public접근 제한 없음

getter와 setter 메서드

  • 캡슐화의 목적을 달성하면서도 데이터의 변경이 필요한 경우 getter와 setter 메서드를 사용 한다.

  • 데이터를 효과적으로 보호하면서도 의도하는 값으로 값을 변경 가능하다.

  • setter 메서드 : 외부에서 메서드에 접근하여 조건에 맞을 경우 데이터 값을 변경 가능하게 해주고 일반적으로 메서드명에 set-을 붙여서 정의한다.

  • getter 메서드 : 설정한 변수 값을 읽어오는 데 사용하는 메서드이다. get-을 메서드명 앞에 붙여서 사용한다.

profile
HelloWorld

0개의 댓글