본문 바로가기

Study/Java

[java] 상속, 인터페이스

기본 데이터형

 int a = 10;

 

오브젝트 데이터형

- 주소값을 갖는 참조형 변수

 

Account ac1 = new Account();

ac1변수 -> Account 클래스에 있는 변수와 메소드에 대한 주소값을 갖는다.

 

Account ac2 = ac1;

- 참조형 변수를 대입한다.

 

자기참조

- 클래스 안에 자기 자신의 데이터 타입을 선언해 두고 그것을 참조로 하는 것

 

상속

- 기존 클래스를 확장해서 새로운 클래스를 만드는 기술

상위 클래스, 하위 클래스

class AA { ... }

class BB extends AA { ... }

 

상속과 생성자

- 자식 클래스가 생성될 때 먼저 부모 클래스를 자동 생성하고, 부모 클래스가 생성될 때 부모 클래스의 생성자가 여러 개 생성되더라도 부모 클래스의 디폴트 생성자를 통해서 자동 생성한다.

- 상속을 받앗을 땐 자식도 그렇지만 부모도 생성되야하고 부모를 호출해야하기 때문에 디폴트 생성자를 생성해줘야한다.

class AA { ...public AA(){}...  }

class BB extends AA { ...super(" ");... }

-> AA 부모 클래스를 사용하고자 하는 생성자에서 super함수를 사용 해준다.

 

자식 클래스는 부모 클래스를 다 사용할 수 있다

필요한 것만 쓰기 위해서 객체를 주고 받고하는 것이다.

 

다형성

해당하는 클래스를 만들었지만, 실제적으로 사용하는 것은 원, 삼각형, 사각형이다.

ex> 도형(draw()) - 원(draw()) 

                         - 삼각형(draw())

                         - 사각형(draw())

Object - equals()

String - equals()

 

Object obj[] = { new String("abc"), new String("def") };

obj[0].equals("abc");

->오버라이딩 메소드만 접근 가능하기 때문에 위의 식은 false가 아닌 true가 나온다.

 

자바의 API는 모두 상속관계에 있고, 다형성으로 이루어져 있다.

 

오버라이딩

class car { ...speedUp(){ speed += 50; }...}

class truck extends car { ...speedUp(){ speed += 20; }...}

- 상속관계에 있는 클래스 안에서 부모의 메소드와 자식의 메소드가  리턴형, 메소드 이름, 인자의 갯수가 모두 같지만, 메소드의 내용이 다른 경우

 

 

형변환

A a = new A();

B b = new B();

자식 클래스가 바뀌면 부모 클래스는 묵시적으로 형변환된다.

class A extends B {

 B b = new A(); }

=> A a = new A(); B b = a; }

 

총.정.리

class B {
 String show(String n) {
  //내용//
 }
}
class A extends B {
 A a = new A();
 a.show(b);
 String show(String n) {
  /\내용/\ ->오버라이딩(새롭게 재정의하는 것)
 }
 void print() { }
 B b = new A(); -> 형변환
 b.show();

 ->오버라이딩 관계에 있는 것은 접근 가능하다.
 b.print();

 -> A클래스 안에만 있는 것 즉, 오버라이딩 관계에 있지 않은 것은  접근 불가능하다.
}

- 오브젝트의 형변환 -

Object obj[] = { new String("abc"), new Integer(1) };
String -> Object, Integer -> Object

 => 상위 클래스형으로 바뀌어졌다.
obj[0].equals();

-> equals는 오브젝트 안에만 있는 것이 아니라 String형 안에도 있어서 오버라이딩되기 때문에 true가된다.
obj[1].equals();

-> equals는 오브젝트 안에만 있는 것이 아니라 Integer형 안에도 있어서 오버라이딩되기 때문에 true가된다.
obj[1].parseInt();

-> object안에는 parseInt함수가 없어서 오버라이딩 되지 않는다.
하지만. obj[0].equals();식이 String -> Object -> String형으로 바뀌었기 때문에, obj[1].parseInt();이 식을 i = (Integer)obj[1]; 로 바꿔줄 수 있다.

 

형변환은 왜 쓸까요?

-> 여러 개의 데이터 타입을 가진 객체들을 하나의 공통 클래스에 묶어 주기 위해서..

 

상속의 의미

1. 자원의 의미

2. 내가 부모의 데이터 형으로 이름이 바뀔 수 있다.

 

추상메소드

- 자바에서 강제성을 띄우기 위해 꼭 구현하도록..

- 본체가 없는 메소드

abstract read();

read() { ... }

 

추상클래스

- 추상메소드를 1개 이상 포함하고 있는 클래스

abstract class A { ... }

 

인터페이스

- 다중 상속을 보완하기 위해서 만들어진 것

class A extends Applet implements Thread

->implement는 여러 개로 쓸 수 있다.

인터페이스로도 형변환이 가능하다.

 

final

- '클래스를 상속하지 않겠다.'는 뜻

 

알아두고 가기

1. 오버라이딩
2. object 형변환 -> 접근할 수 있는 메소드
 묵시적 형변환 - 상위
 명시적 형변환 - 하위
 인위적으로 예외처리 발생
3. 다형성 -> 추상클래스, 인터페이스 구별 -> 추상메소드의 특징(강제성)

 

 

 

interface를 쉽게 이해하기

/*
 * SpeakTest.java
 *
 * interface의 사용방법을 알기 위한 프로그램.
 *
 *                             by   j.b.j
 */

/* interface의 선언. */
interface Speakable {
 public String speak();
}

class Man {
 private String name;

 public Man(String name) {
  this.name = name;
 }

 public String getName() {
  return name;
 }
}// end class Man

/* Speakable interface를 구현한 클래스*/
class Reader extends Man implements Speakable {
 public Reader(String name) {
  super(name);
 }

 /* Speakable의 메소드 구현. */
 public String speak() {
  return getName() + " 독자는 자바를 잘 하고싶다 ~~";
 }
}// end class Reader

/* Speakable interface 를 구현한 클래스*/
class Worker extends Man implements Speakable {
 public Worker(String name) {
  super(name);
 }

 /* Speakable 의 메소드 구현. */
 public String speak() {
  return getName() + " 일꾼은 자기가 맡은 일을 열심히 한다~~";
 }
}// end class Worker

/* Speakable interface 를 구현하지 않은 클래스*/
class Student extends Man {
 public Student(String name) {
  super(name);
 }

 public String speak() {
     return getName() + " 학생은 공부를 열심히 한다~~";
 }
}// end class Student

/* 메인 클래스 */
public class SpeakTest {
 public static void main(String[] args) {
  /* Object 배열을 생성한다. */
  Object[] obj = { new Reader("길동"), new Worker("둘리"), new Student("마이콜")};

  for(int i=0 ; i<obj.length ; i++) {
   /* 객체 obj[i]이 Speakable을 구현한 객체라면... */
   if(obj[i] instanceof Speakable) {
    Speakable speaker = (Speakable) obj[i];
    System.out.println(speaker.speak());
   }
  }
 }
}// end

 

'Study > Java' 카테고리의 다른 글

[java] 예외처리, 정적필드  (0) 2019.05.15
[java] 상속, 인터페이스 실습  (0) 2019.05.15
[java] for문의 활용  (0) 2019.05.15
[java] 객체지향 실습  (0) 2019.05.14
[java] 객체지향  (0) 2019.05.14