1.오버라이드, Override


흔히들 비교를 많이하는 오버로딩의 친구 오버라이드는


오버로딩이 클래스 내부에서 같은 이름의 메소드를 여러개 선언한다면


오버라이드는 상속받은 메소드의 이름을 같게 하여 새로 튜닝한다고 이해하면 된다.


그리고 final로 선언된 메소드는 전에 설명한것과 같이 상속 받을 수 없고 오버라이드 또한 불가능하다.


다음 예제를 확인해보자



package Chap05.exam04.tune;

public class ParentCar {
	public void Start() {
		System.out.println("시동");
	}
	public void run() {
		System.out.println("시속 50km/h으로 달립니다.");
	}
	public void Stop() {
		System.out.println("정지");
	}
	public final void test() {
		System.out.println("자체 점검");
	}
}
package Chap05.exam04.tune;

public class MyCar extends ParentCar {
	
	boolean sw = false;
	
	// 오버라이드 (ctrl + shift + s의 Override로 내용을 완전히 바꿈)
	@Override
	public void run() {
		// super.run();
		System.out.println("시속 30km/h으로 달립니다.");
	}

	
	// 오버라이드 (상황에 따라)
	@Override
	public void Stop() {
		// super.Stop();
		if(sw) {
			System.out.println("정지 후 자동 주차");
		}else{
			super.Stop();
		}
		
	}

}
package Chap05.exam04.tune;

public class Main {

	public static void main(String[] args) {
		MyCar k3 = new MyCar();
		k3.Start(); // 부모 클래스 
		k3.run(); // 자식 클래스에서 오버라이드 한 내용
		k3.Stop(); // 부모 클래스
		k3.sw = true;
		k3.Stop(); // 자식이 바꾼 내용
	}

}


'개념 및 코딩 > 05.상속' 카테고리의 다른 글

[JAVA]05-06.익명객체, 결합도  (0) 2018.08.30
[JAVA]05-05.추상클래스, 인터페이스  (0) 2018.08.30
[JAVA]05-04.다형성 배열, 활용  (0) 2018.08.29
[JAVA]05-03.다형성  (0) 2018.08.29
[JAVA]05-01.상속  (0) 2018.08.24

1.상속, Inheritance


상속은 단어 그대로의 의미는 부모의 유산을 자녀가 상속하다. 라고 할 때 쓰이는데


Java에서는 다른 클래스의 기능을 그대로 이어받는, 변수와 메소드들을 그대로 사용 가능한 것을 말한다. 부모클래스의 선언 없이 메소드와 


변수를 자식 클래스에서 사용 할 수 있다. 다른 말로는 일반화라고 하기도 한다.


상속을 사용하는 이유는 다른 사람의 코드를 가져다 쓰기 쉽고 코드의 중복을 피하기 쉽고


다른 사람의 코드를 가져다 쓴다면 내가 생각하지 못한 기술들을 활용할 수 있다.


하지만 앞에서 설명했던 접근제한자를 보면 private로 선언하게 되면 상속받아도 사용할 수 없게끔 할 수 있다.


그리고 C++에선 다중상속이 허용되지만 Java에서는 사용할 수 없다. 사용하기 위해선 클래스마다 하나씩 하나씩 상속하는 방법밖에 없다.


만약 자식클래스를 호출한다면 컴파일러는 우선 부모클래스를 호출 하고나서 자식 클래스를 호출하고 부모 클래스의 생성자는 생략한다.


그러므로 자식 클래스에서 부모 클래스의 생성자를 이용하기 위해 따로 명시를 해두어야 한다.


이제부터는 클래스 다이어그램도 예제와 같이 올리는데


꼭 클래스 다이어그램을 통해 클래스의 구조를 파악하는 방법을 확인하고 나서 예제를 살펴보자





예제는 다음과 같다.



package Chap05.exam03.superCtr;

public class Parent {
	
	public String attr1;
	public int attr2;
	
	public Parent(String attr1, int attr2) {
		this.attr1 = attr1;
		this.attr2 = attr2;
	}

}


package Chap05.exam03.superCtr;

public class Child extends Parent {
	public String field;
	public Child(String attr1, int attr2, String field) {
		super(attr1, attr2); // 상속해준 부모 클래스에 생성자 인자값 전달
		this.field = field;
		
	}

}


package Chap05.exam03.superCtr;

public class Main {

	public static void main(String[] args) {
		Child kid = new Child("널", 2147483647, null);
		System.out.println(kid.attr1);
		System.out.println(kid.attr2);
		System.out.println(kid.field);
	}
}


'개념 및 코딩 > 05.상속' 카테고리의 다른 글

[JAVA]05-06.익명객체, 결합도  (0) 2018.08.30
[JAVA]05-05.추상클래스, 인터페이스  (0) 2018.08.30
[JAVA]05-04.다형성 배열, 활용  (0) 2018.08.29
[JAVA]05-03.다형성  (0) 2018.08.29
[JAVA]05-02.오버라이드  (0) 2018.08.27

1.접근제한자


public : 클래스 안과 밖, 패키지 안과 밖 구분없이 모든 클래스들이 접근 가능


protected : 같은 패키지나 상속 관계일 경우 접근 가능


default : 같은 패키지에 속한 클래스만 접근 가능, 따로 접근제한자를 명시하지 않으면 default로 설정 됨


private : 클래스 안에서만 접근 가능 객체화.변수같이 사용할 수 없음, 캡슐 구조의 핵심





다음은 컴퓨터의 상태(실제 상태가 아니고 임의의 값을 넣음)를 출력하는 클래스 입니다.


예제를 보고 private으로 선언된 변수를 다루는것을 확인해보자.

package chap04.exam12.prv;

import java.util.Scanner;

// Private 접근제한자를 쓰는 이유
public class Computer {
	Scanner scanner = new Scanner(System.in);	
	private boolean power; // 외부에서 보기/수정 가능
	private int panSpeed;    // 외부에서 보기/수정 가능
	private int temp;           // 외부에서는 조절 불가, 보기는 가능

	
	public boolean isPower() {
		return power;
	}

	public void setPower(boolean power) {
		this.power = power;
		if(this.power) {
			this.panSpeed = 50;
			this.temp = 60;
		}else {

		}
	}

	public int getPanSpeed() {
		return panSpeed;
	}

	public void setPanSpeed(int panSpeed) {
		this.panSpeed = panSpeed;
		this.temp = 110 - this.panSpeed;
	}

	public int getTemp() {
		return temp;
	}

	public Computer() {
		System.out.println("컴퓨터 전원을 키시겠습니까? (y/n)");
		char state = scanner.nextLine().charAt(0);

		if(state == 'y') {
			System.out.println("전원이 켜졌습니다.");
			this.power = true;
			this.temp = 30;
		}else {
			System.out.println("전원이 꺼집니다.");
			this.power = false;
		}
		
	}
	
	boolean powerState() {
		return power;
	}
	
	void powerstate() {
		if(power) {
			System.out.println("전원이 켜져있습니다.");
		}else {
			System.out.println("전원이 꺼져있습니다.");
		}
	}
	
	int panSpeedState() {
		return panSpeed;
	}
	
	void changePanSpeed(int speed) {
		this.panSpeed = speed;
		System.out.println("팬 속도가 " + panSpeed + "로 바뀌었습니다.");
		
		if(panSpeed >= 10) {
			this.temp = 20;
		}else {
			this.temp = 30;
		}
	}
	
	int tempState() {
		return temp;
	}
	
	void powerOff() {
		this.power = false;
		System.out.println("컴퓨터가 종료됩니다.");
	}
}


다음은 Main 이 computer 클래스를 불러와 각종 private 정보에 접근하는 프로그램입니다.

package chap04.exam12.prv;

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		// 전원 켜기
		// 전원 상태 보기
		// 팬 속도 보기
		// 팬 속도 조절
		// 온도 확인
		Scanner scan = new Scanner(System.in);
		int a = 0;
		int result = 0;
		
		Computer com = new Computer();
		
		if (com.powerState()) {
			while(true) {
				System.out.println("\n어떤 처리를 하시겠습니까? (1~5 사이의 숫자 입력)");
				System.out.println("\n1. 전원 상태보기");
				System.out.println("2. 팬 속도 보기");
				System.out.println("3. 팬 속도 조절");
				System.out.println("4. 온도 확인");
				System.out.println("5. 컴퓨터 종료");
				result = scan.nextInt();
				
				switch (result) {
					case 1:
						com.powerstate();
						break;
						
					case 2:
						System.out.println("팬의 속도는 " + com.panSpeedState() + "입니다.");
						break;
						
					case 3:
						System.out.println("원하시는 속도를 입력해주세요.");
						a = scan.nextInt();
						com.changePanSpeed(a);
						break;
						
					case 4:
						System.out.println("현재 컴퓨터의 온도는 " + com.tempState() + "도 입니다.");
						break;
				}
				if(result == 5) {
					com.powerOff();
					break;
				}
			}
		}
		scan.close();
	}

}


2.Final 상수


final 키워드는 더 이상 변경이 불가능하게 설정하는 키워드이다.


즉, 변수의 값을 변경할 수 없으므로 상수라고 부른다.


그러므로 상수는 생성과 함께 초기화도 해주어야 한다.


메소드에 Final을 붙일 경우에는 상속시에도 오버라이딩이 불가능한데 이 경우는 상속에서 다시 설명한다.


다음 예제를 보고 확인해보자.



package chap04.exam09.readOnly;

public class Person {
	final String nation;
	final static String ssn; // 변경이 불가능하므로 상수(CONSTANT)
	final String name;
	
	public Person(String nation, String name) {
		this.nation = nation;
		this.name = name;
	}
	
	static { // 사실상 초기화가 불가능
		System.out.println("호오추울");
		ssn = "205938-984327";
	}
	
}


package chap04.exam09.readOnly;

public class Main {

	public static void main(String[] args) {
		Person pp = new Person("한국",  "이름");
		/* final이 붙어 있어 오류발생, 주석처리
		pp.name = "홍길동";
		*/
		System.out.println(pp.name);
		System.out.println(pp.nation);
		System.out.println(Person.ssn);
	}

}


+ Recent posts