728x90
728x90

 

 

 

 

 

 

명품자바프로그래밍 1장 요약, 예제

명품자바프로그래밍 2장 요약, 예제

명품자바프로그래밍 3장 요약, 예제

명품자바프로그래밍 4장 요약, 예제

 


 

 

명품자바프로그래밍 5장 요약

 

 

상속

 

상속이란?

 

부모 클래스에서 만들어진 필드와 메소드자식 클래스가 물려받는 것. 상속의 선언은 extend 키워드와 함께 사용한다.

 

public class Person{}
public class Student extends Person{}

장점 : 같은 속성의 수정이 필요할 경우 부모 클래스만 수정하고 여러 개의 클래스를 모두 수정할 필요가 없어 유지보수가 쉽다. 

--> 코드 중복을 제거하여 클래스를 간결하게 구현한다.

 

1. 클래스 간결화 - 멤버 중복작성 불필요

2. 클래스 관리 용이 - 클래스의 계층적 분류

3. 소프트웨어의 생산성 향상 - 클래스 재사용, 확장이 쉬움

 

 

상속의 특징 

 

1. 자바에서는 클래스 다중 상속 (multiple inheritance)를 지원하지 않는다. (C++은 지원한다)

--- 다중상속은 부모 클래스들이 같은 이름의 함수를 가진 경우 모호성으로 문제 유발 가능성이 있다. 자바는 이를 원천봉쇄.

 

2. 상속의 횟수에 제한이 없다.

 

3. 계층 구조의 최상위에 java.lang.Object 클래스가 있어서 자동으로 상속받도록 컴파일된다.

--- Object 클래스만이 유일하게 슈퍼클래스를 가지지 않는다.(이하 6장에서 추가 설명)​. 클래스의 최고조상님이다.

 

 

 

 

 

서브 클래스 객체 생성

 

서브 클래스는 슈퍼클래스의 private 멤버를 제외하고 모든 멤버를 접근할 수 있다.

 

 

 

슈퍼클래스 멤버의 접근 지정자

 

슈퍼클래스 멤버에 선언한 4가지 접근 지정에 대해 다른 클래스에서 어디까지 접근이 허용될까? (O : 접근가능)

Protected의 경우 같은 패키지의 모든 클래스, 그리고 패키지 상관없이 상속받는 서브 클래스에 접근이 가능하다.

 

슈퍼클래스 멤버에 접근하는
클래스 종류

 슈퍼 클래스 멤버의 접근 지정자
private default protected public
같은 패키지에 있는 클래스 X O O O
다른 패키지에 있는 클래스 X X X O
같은 패키지에 있는 서브 클래스 X O O O
다른 패키지에 있는 서브 클래스 X X O O

 

 

 

 

생성자

 

Q. 서브 클래스의 생성자와 슈퍼 클래스의 생성자 중 누가 먼저 실행될까? (슈퍼클래스의 생성자)

Q. 서브 클래스 객체가 생성될 때 서브클래스의 생성자와 슈퍼 클래스의 생성자가 모두 실행될까? (0)

 

답의 이유는 아래 그림 '슈퍼 클래스와 서브 클래스의 생성자 간 호출 및 실행 관계도를 보면서 이해해보자.

 

 

 

 

 

 

 

서브 클래스에서 슈퍼 클래스 생성자 선택

 

슈퍼 클래스에 여러 생성자가 있을 때 서브 클래스의 생성자와 함께 실행될 슈퍼클래스의 생성자는 원칙적으로 서브 클래스의 개발자가 각 생성자에 대해 함께 실행될 슈퍼클래스의 생성자를 지정한다. 그러나 명시하지 않았을 경우 컴파일러가 자동으로 슈퍼클래스의 기본 생성자를 호출하도록 자바 컴파일러가 작동한다.

 

슈퍼 클래스에 기본 생성자가 없을 경우 컴파일 오류 메세지를 출력한다. (Implicit super constructor A() is undefined. Must explicitly invoke another constructor

 

 

서브클래스의 생성자에서 super()를 이용하면 서브클래스에서 명시적으로 슈퍼클래스의 생성자를 선택할 수 있다. 괄호 안에 인자를 넣을 수도 있다. 요점은 super()가 반드시 생성자의 첫 줄에 사용되어야 한다는 것! (예제 5-3 참고)

 

* super() : 슈퍼 클래스 생성자를 호출하는 코드

 

 

 

 

 

 

캐스팅 Casting  :  타입 변환. 자바에서 클래스에 대한 캐스팅은 업캐스팅, 다운캐스팅이 있다.

 

 

업캐스팅 : 업캐스팅은 슈퍼 클래스의 레퍼런스로 서브 클래스의 객체를 가리키게 한다. 서브 클래스의 객체에 대한 레퍼런스를 슈퍼 클래스 타입으로 변환하는 것. 

 

Person p;
Student s = new Student();
p = s; //upcasting

 

 

다운캐스팅 : 업캐스팅의 반대이며 타입 변환을 명시적 지정해야 한다. 원래의 자기 자신으로 돌린다는 의미.

 

Student s = (Student)p; //downcasting, (student)의 타입 변환을 반드시 표시해야 됨

 

 

 

instance of 연산자 : 객체가 어떤 클래스를 상속받아 업캐스팅되어 넘어오는 지 구별하는 방법. 이항 연산자이며 레퍼런스가 가리키는 객체가 해당 클래스 타입의 객체이면 true, 아니면 false 로 계산하기 때문에 결과값은 boolean 값이다. 

 

 

* 래퍼런스 instanceof 클래스명

 

Person jee = new Student();
Person kii = new Professor();
if (jee instanceof Person) //true
if (jee instanceof Student) //true
if (kii instanceof Student) //false

// if(3 instanceof int) 객체에 대한 레퍼런스만 사용해서 문법 오류.
if ("java" instanceof String) //true

 

 

 

 

메소드 오버라이딩 method overriding : 슈퍼클래스에서 선언된 메소드와 같은 이름, 같은 리턴 타입, 같은 매개 변수 리스트를 갖는 메소드를 서브 클래스에서 재작성하는 것. 슈퍼클래스에 있는 메소드로 기능을 구현하지 못할 때 동일한 이름의 메소드를 서브클래스에 다시 작성한다. 실행 역시 서브클래스 내의 메소드만 실행된다. (= 슈퍼클래스메소드 무시, 혹은 덮어쓰기라고도 하며 동적바인딩이라고 한다.)

어떻게 호출되든 객체 안의 오버라이딩된 메소드의 호출이 무조건 보장된다. 

 

--- 메소드 오버로딩과 오버라이딩의 차이에 대해 정리해보고 넘어가기. (타 블로그 참조)

 

오버라이딩의 목적 : 다형성 실현

 

오버라이딩 제약 조건

슈퍼클래스 메소드와 동일한 원형으로 작성 (동일 이름, 동일 매개변수 타입, 동일 개수, 동일한 리턴타입의 메소드)

슈퍼클래스 메소드의 접근 지정자보다 접근의 범위를 좁혀 오버라이딩 불가 (키우는 건 가능)

static, private, final 메소드는 서브클래스에서 오버라이딩 할 수 없다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

명품자바프로그래밍 클래스와 객체 5장 예제

 

| 예제 5-1 | 클래스 상속 만들기

x, y의 한 점을 표현하는 Point 클래스와 이를 상속받아 색을 가진 점을 표현하는 ColorPoint 클래스를 만들고 활용해보자.

 

(1,2)

red(3,4)

 

package Luxuryjava05;

class Point {
	private int x, y;

	// 좌표
	public void set(int x, int y) {
		this.x = x;
		this.y = y;
	}

	// 좌표 출력
	public void showPoint() {
		System.out.println("(" + x + "," + y + ")");
	}
}

class ColorPoint extends Point {
	private String color;
	// 점의 색 
	public void setColor(String color) {
		this.color = color;
	}
	public void showColorPoint() {
		// 컬러 점의 좌표 
		System.out.print(color);
		showPoint();
	}
}

public class ColorPointEx {

	public static void main(String[] args) {
		Point p = new Point();
		p.set(1, 2);
		p.showPoint();

		ColorPoint cp = new ColorPoint();
		cp.set(3, 4);
		cp.setColor("red");
		cp.showColorPoint();
	}
}

 

 

 

 

| 예제 5-2 | 상속 관계에 있는 클래스 간 멤버 접근

클래스 Person을 아래와 같은 필드를 갖도록 선언하고, 클래스 Student는 Person을 상속받아 각 멤버 필드에 값을 저장하라.

 

클래스Person의 private필드 weight는 클래스Student에서 접근 불가능해 슈퍼클래스Person의 get, set 메소드를 통해서만 조작이 가능

 

private int weight;
int age;
protected int height;
public String name;
package Luxuryjava05;

class Person {
	private int weight;  // *** student 클래스 접근불가
	int age;           // 디폴트. student 클래스 접근가능
	protected int height;    // student 클래스 접근가능
	public String name;      // student 클래스 접근가능

	public void setWeight(int weight) {
		this.weight = weight;
	}

	public int getWeight() {
		return weight;
	}
}

class Student extends Person {
	public void set() {
		age = 30;
		name = "gildong";
		height = 180;
		setWeight(99);   // 간접접근
		// weight = 99; 슈퍼 클래스의 멤버 접근불가
	}
}

public class InheritanceEx {

	public static void main(String[] args) {
		Student s = new Student();
		s.set();

	}

}

 

 

 

 

| 예제 5-3 | super()를 활용한 Colorpoint 작성

 super()를 이용하여 Colorpoint 클래스 생성자에서 슈퍼 클래스 Point의 생성자를 호출하는 예를 보인다.

 

blue(5,6)

 

package Luxuryjava05;

class Point {
	private int x, y;

	public Point() {
		this.x = this.y = 0;
	}

	public Point(int x, int y) {
		this.x = x;
		this.y = y;
	}

	public void showPoint() {
		System.out.println("(" + x + "," + y + ")");
	}
}

class ColorPoint extends Point {
	private String color;

	public ColorPoint(int x, int y, String color) {
		super(x, y);
		this.color = color;
	}

	public void showColorPoint() {
		System.out.println(color);
		showPoint();
	}
}

public class SuperEx {

	public static void main(String[] args) {
		ColorPoint cp = new ColorPoint(5, 6, "blue");
		cp.showColorPoint();

	}
}

 

 

 

 

| 예제 5-4 | instanceof 연산자 활용

instanceof 연산자 활용하여 상속 관계에 따라 레퍼런스가 가리키는 객체의 타입을 알아본다. 실행 결과는 무엇인가?

 

new Student() -> Person Student 

new Researcher() -> Person Researcher 

new Professor() -> Person Researcher Professor 

 

package Luxuryjava05;

class Person{}
class Student extends Person {}
class Researcher extends Person {}
class Professor extends Researcher {}

public class InstanceOfEx {
	
	static void print(Person p) {
		if(p instanceof Person)
			System.out.print("Person ");
		if(p instanceof Student)
			System.out.print("Student ");
		if(p instanceof Researcher)
			System.out.print("Researcher ");
		if(p instanceof Professor)
			System.out.print("Professor ");
		System.out.println();
		
	}

	public static void main(String[] args) {
		System.out.print("new Student() -> \t");
		print(new Student());
		System.out.print("new Researcher() -> \t");
		print(new Researcher());
		System.out.print("new Professor() -> \t");
		print(new Professor());
	}

}

 

 

 

 

 

| 예제 5-5 | 메소드 오버라이딩으로 다형성 실현

Shape의 draw() 메소드를 Line, Circle, Rect 클래스에서 목적에 맞게 오버라이딩하는 다형성의 사례

 

Line

Shape

Line
Rect

Circle

 

package Luxuryjava05;

class Shape {
	protected Shape next;
	protected Shape() { next = null; }
	
	protected void draw() {
		System.out.println("Shape");
	}
}

class Line extends Shape {
	protected void draw() {
		System.out.println("Line");
	}
}

class Rect extends Shape {
	protected void draw() {
		System.out.println("Rect");
	}
}

class Circle extends Shape {
	protected void draw() {
		System.out.println("Circle");
	}
}

public class MethodOverridingEx {
	static void paint(Shape p) {
		p.draw();
	}

	public static void main(String[] args) {
		Line line=new Line();
		
		paint(line);
		paint(new Shape());
		paint(new Line());
		paint(new Rect());
		paint(new Circle());

	}

}

 

 

 

 

| 예제 5-6 | 

 

 

 

 

| 예제 5-7 | 

 

 

 

 

| 예제 5-8 | 

 

 

 

 

| 예제 5-9 | 

 

 

 

 

 

5. 상속.pdf
4.06MB

 

 

 

 

 

 

728x90
728x90
블로그 이미지

coding-restaurant

코딩 맛집에 방문해주셔서 감사합니다.

,

v