1. 캡슐화(정보은닉)
필드 + 메소드 = class
2. 상속
부모로부터 어떤 [성질]을 물려받는 것.
상속하는 그 시점을 봤을 때 그대로 물려받는 것.
기존의 클래스(부모 클래스)를 재사용해서 새로운 클래스 작성하는 방법.
발전 순서
구조적 프로그래밍 => 함수 사용 => 객체 지향
기존 클래스의 멤버 + 새로운 멤버 = 새 클래스
=> 기존 클래스의 메버를 그대로 가지고 오는 것을 상속이라고 함.
기존 클래스 : 부모, 조상 클래스
새 클래스 : 자식, 자손 클래스
상속의 장점
1. 클래스의 간결화 => 중복된 코드 작성 불필요.
2. 클래스 관리 용이 => 클래스를 계층적으로 분류 및 관리
3. 소프트웨어의 생산성이 향상됨 => 클래스의 재사용과 확장 용이, 새로운 클래스의 작성에 속도 빠름
클래스 간의 관계
1. 상속관계 : is a(그게 그거다.)
2. 포함관계 : has a(가지고 있는거다.)
상속 예제) 학생, 알바 학생, 연구원 학생, 교수
class Person {
public void speaking() { }
public void eating() { }
public void walking() { }
public void sleeping() { }
}
class Student extends Person{
public void studying() { }
}
class StudentWorker extends Student{
public void working() { }
}
class Researcher extends Person {
public void research() { }
}
class Professor extends Researcher {
public void teaching() { }
}
1. 학생 - 말하기, 먹기, 걷기, 잠자기, 공부하기
2. 알바 - 말하기, 먹기, 걷기, 잠자기, 공부하기, 일하기
3. 연구원 - 말하기, 먹기, 걷기, 잠자기, 연구하기
4. 교수 - 말하기, 먹기, 걷기, 잠자기, 연구하기, 가르치기
상속의 대칭화
묶음으로 처리를 해서 관리가 편리(용이함)
공통되는 기능을 person에 넣어 상속 받아 사용함.
상속의 특징
자바에서 클래스의 상속은 단일 상속만 지원(다중 상속 불가)
여러 클래스를 통합할 경우 주가 되는 하나의 클래스를 상속받고 나머지 클래스는 포함관계로 활용.
다중 상속은 불가지만, 다단 상속은 가능함.
모든 클래스는 하나의 조상을 갖는다. => Object 클래스
새로 추가해서 작업을 좀 더 간단하게 효율적으로 빠른 시간내에 끝내도록 하는 것이 상속임.
상속 예제)
public class PointTest {
public static void main(String[] args) {
Point p1 = new Point();
ColorPoint cp1 = new ColorPoint();
Point3D p3_1 = new Point3D();
p1.set(1, 2);
p1.showPoint();
cp1.set(3, 4);
cp1.setColor("RED");
cp1.showColorPoint();
}
}
colorPoint 안에 setColor도 포함되어있음.
class Point {
private int x;
private int 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.println(color);
showPoint();
}
}
public void showPoint3D() {
showPoint();
System.out.println("z : " + z);
}
}
class ColorPoint3D extends Point3D{
ColorPoint cp = new ColorPoint();
}
점의 색상을 표현하는 부분
showPoint() 상속받은 거라 보이지는 않지만 호출해서 사용 가능함.
private, public void showPoint, public void setColor 다 있음.
class Point3D extends Point {
int z;
public void setZ(int z) {
this.z = z;
}
public void showPoint3D() {
showPoint();
System.out.println("z : " + z);
}
}
class ColorPoint3D extends Point3D{
ColorPoint cp = new ColorPoint();
}
Point3DPoint3D는 Point를 확장한(상속받은) 클래스다.
class ColorPoint3D extends Point3D, ColorPoint 이런 형식으로는 사용이 불가능함.
오버라이딩(Overriding)
부모 클래스의 메소드를 자손 클래스에서 새로 정의하는것.
반환형, 이름, 매개변수(type, 갯수)는 동일하지만, 정의된 내용이 다르다.
cf. 매개변수 다를 경우 오버라이딩이 아닌 오버로딩이 된다.
부모 클래스의 메소드가 자손 클래스에서 사용하기에 맞지 않을 때 부모 클래스의 메소드를 덮어써서 새로운 메소드로 다시 만드는 작업.
자손 클래스의 인스턴스에서는 부모 클래스의 메소드를 없는 것으로 처리
(메소드가 없어지는 것은 아니며, 부모 클래스의 인스턴스에서는 사용이 가능하다.)
부모 클래스의 모든 매소드를 재정의하는 것이 아니라 변경이 필요한 메소드만 재정의한다.
생성자의 이름은 클래스의 이름과 동일하다. => 자동클래스는 자동클래스로서의 이름을 가지고 있다.
오버라이딩 예제) 커피의 이름, 가격
public class OverrideTest {
public static void main(String[] args) {
TeaInfo coffee = new TeaInfo();
coffee.setName("아메리카노");
coffee.setPrice(3000);
System.out.println(coffee);
Point01 p1 = new Point01();
p1.x = 1;
p1.y = 2;
System.out.println(p1.getLocation());
Point3D01 p2 = new Point3D01();
p2.x = 5;
p2.y = 6;
p2.z = 7;
System.out.println(p2.getLocation());
}
}
coffee.setName("아메리카노");
coffee.setPrice(3000);
동일한 표현 => System.out.println("이름 : " + coffee.getName() +"\n" + "가격 : " + coffee.getPrice());
class TeaInfo extends Object{
private String name;
private int price;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
@Override
public String toString() {
return "이름 : " + name + "\n" + "가격 : " + price;
}
}
toString은 객체를 문자열화 변환시켜주는 method이다.
System.out.println()에 들어가게되면 객체의 정보를 문자로 변환하게된다.
오버라이딩 예제2)
class Point01 {
int x, y;
String getLocation() {
return "x : " + x + ", y : " + y;
}
}
class Point3D01 extends Point01 {
int z;
@Override
String getLocation() {
return "x : " + x + ", y : " + y + ", z : " + z;
}
}
똑같은 이름을 사용해서 출력을 해준다는 의미이다.
똑같은 이름의 method를 재정의해준다. 파라미터, return, 클래스명이 동일해야한다.
대신 부모클래스의 메소드를 상속받을 대 사용한다.
상속의 접근제한
public | 상속과 관계없이 제약 없이 접근 가능 |
default | 상속과 관계 없이 같은 패키지의 클래스에서만 접근 가능 |
protected |
같은 패키지와 다른 패키지의 상속받은 클래스에서만 접근 가능 규칙성을 갖고 활용하게끔 제약을 걸어주도록 사용함 |
private | 상속과 관계없이 다른 클래스에서 접근 불가 |
* private를 제외하면 상속을 하건 안 하건 똑같음
상속 상황에서의 접근 제어자 테스트
package 1 => A, B, D 클래스
package 2 => C, E 클래스
1) package1 안의 class A
package package1;
public class A {//상속 상황에서의 접근 제어자 테스트
private int pri;
int def;
protected int pro;
public int pub;
}
2) package1 안의 class B
package package1;
public class B extends A {
public void set() {
//pri = 1;
def = 2;
pro = 3;
pub = 4;
}
}
private는 같은 클래스에서만 사용 가능하기 때문에 오류가 발생한다.
상속을 해도 자식 클래스에서는 접근이 불가하다.
protected memeber는 상속했기 때문에 사용이 가능하다.
private는 접근해서 사용하는게 불가능하다.
3) package2 안의 class C
package package2;
import package1.A;
public class C extends A {
public void set() {
//pri = 10;
//def = 20;
pro = 30;
pub = 40;
}
}
private private는 상속해서 사용이 불가능하다.
default는 같은 패키지에서만 가능하다. 패키지가 다르므로 사용이 불가능하다.
protected 다른 패키지여도 상속받으면 사용이 가능하다.
public 제한이 없으므로 마음껏 사용 가능하다.
4) package1 안의 class D
package package1;
public class D {
public void set() {
A a = new A();
//a.pri = 100;
a.def = 200;
a.pro = 300;
a.pub = 400;
}
}
private 상속해서 사용이 불가능하다.
default a와 같은 패키지므로 사용이 가능하다.
protected 같은 패키지므로 사용이 가능하다.
public 제한이 없으므로 마음껏 사용 가능하다.
5) package2 안의 class E
package package2;
import package1.A;
public class E {
public void set() {
A a = new A();
//a.pri = 1000;
//a.def = 2000;
//a.pro = 3000;
a.pub = 4000;
}
}
protected
같은 패키지에서는 접근이 가능하다. 다른 패키지의 경우에는 상속을 받지 않는 한 접근이 불가능하다.
같은 패키지일 경우 상속을 받지 않아도 접근이 가능하다.
다른 패키지일 경우에는 상속을 받으면 접근이 가능하다.
'JAVA' 카테고리의 다른 글
0330 JAVA - 객체지향의 특성(다형성) (0) | 2020.03.31 |
---|---|
0330 JAVA - 객체지향의 특성(상속) (0) | 2020.03.31 |
0317 JAVA - 객체지향(캡슐화), static 메소드와 인스턴스 메소드 (0) | 2020.03.17 |
0316 JAVA - 객체지향 (0) | 2020.03.16 |
0311 JAVA - 배열, 최소값과 최대값 비교, 버블정렬, 선택정렬 (0) | 2020.03.11 |