상속을 활용 객체지향 프로그래밍

JongseokLee·2021년 7월 25일
1
post-thumbnail

상속을 활용 객체지향 프로그래밍

1. 상속 기본 문법 이해하기

1)패키지(package)란?

관련된 클래스 및 인터페이스 등을 모아 놓은 폴더

2)모듈(module)이란?

관련 패키지들을 모아 놓은 것
프로그램 실행 시 필요한 모듈만 사용하여 메모리에 효율적으로 사용

3)import 문

패키지에 있는 클래스들을 참조하기 위해 사용

4)package 문

프로그래머가 작성한 프로그램의 패키지를 지정

5)상속(inheritance)

기존 클래스의 멤버 변수와 멤버 메소드를 모두 가짐
추가적인 멤버 변수와 멤버 메소드를 정의
기존의 멤버 변수와 멤버 메소드를 재정의
상속해 주는 클래스:부모 클래스, 슈퍼(super)클래스,상위클래스
상속받는 클래스:자식 클래스, 서브(sub)클래스,하위클래스
단일 상속: 부모 클래스는 반드시 하나이고, 자식 클래스는 여러 개일 수 있음
상속을 정의하는 법: extends 키워드를 사용

6)접근 제한자(access modifier)

클래스 또는 클래스의 멤버에 대한 접근을 제한하는 키워드
클래스, 멤버 변수(필드), 멤버 메소드(메소드), 생성자 메소드에 사용

2. 일관성 및 다향성 이해하기

1) 객체 형변환

업 캐스팅(up casting): 상위 클래스의 참조 변수가 하위 클래스의 객체를 참조하는 것
다운 캐스팅(down casting): 하위 클래스의 참조 변수가 상위 클래스의 객체를 참조하는 것

2) 추상 클래스(abstract class)

추상 메소드를 가지는 클래스
abstract 키워드를 지정하여 클래스와 메소드를 정의
추상 클래스를 상속 받은 하위 클래스들은 반드시 추상 메소드를 오버라이딩 해야 함
추상 클래스를 상속하여 또 다른 추상 클래스를 만들 수 있음
추상 클래스의 참조 변수는 하위 클래스의 객체를 참조할 수 있음(객체 형변환 가능)

3) 인터페이스(interface)

자바는 단일 상속만 허용, 다중 상속의 대안으로 사용
인터페이스 정의: interface 키워드를 사용
인터페이스 구현: implements 키워드를 사용

4) 내부 클래스(inner class)

클래스 내부에 또다시 선언된 클래스
종류: 내부 클래스, 메소드 안에 선언된 내부 클래스, 내부 무명(익명) 클래스

5) final

클래스 선언 시 지정
메소드 선언 시 지정
변수 선언 시 지정

3. 실습

1)Hardware 추상 클래스 정의
2)Switch 인터페이스 정의
3)Hardware를 상속하고, Switch를 구현한 Robot클래스 구현
4)필요에 따라 특성 및 기능을 추가하시오

package exim;

public class Robot extends Hardware implements Switch {

	public void powerOn() {  	// Hardware 추상 클래스로 부터 정의(필수)
		if(power == false) {
			power = true;
			System.out.println("[Power ON]");
		} else {
			System.out.println("Already Power ON!!");
		}
	}
	public void powerOff() {	// Hardware 추상 클새스로 부터 오버라이딩
		if(power == true) {
			power = false;
			System.out.println("[Power OFF]");
		} else {
			System.out.println("Already Power OFF!!");
		}
	}
	public void switchOn() {	// Switch 인터페이스로 부터 정의(필수)
		System.out.println(Switch.NAME+" Trying.. Power ON!!");
		powerOn();
	}
	public void switchOff() {	// Switch 인터페이스로 부터 정의(필수)
		System.out.println(Switch.NAME+" Trying.. Power OFF!!");
		powerOff();
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Robot r = new Robot();
		r.switchOn();
		r.switchOn();
		r.switchOff();
		r.switchOff();
		r.switchOn();
	}
}

------------------------------------------------------

package exim;

public abstract class Hardware {
	public boolean power = false;
	abstract public void powerOn();  // 추상 메소드
	public void powerOff() {
		power = false;
	}
}

------------------------------------------------------

package exim;

public interface Switch  {
	public static final String NAME = "[SWITCH]";
	public void switchOn();
	public void switchOff();
}

<Result>

	[SWITCH] Trying.. Power ON!!
	[Power ON]
	[SWITCH] Trying.. Power ON!!
	Already Power ON!!
	[SWITCH] Trying.. Power OFF!!
	[Power OFF]
	[SWITCH] Trying.. Power OFF!!
	Already Power OFF!!
	[SWITCH] Trying.. Power ON!!
	[Power ON]

profile
DataEngineer Lee.

0개의 댓글