10 번째 개발일지

in #kr7 years ago (edited)

안녕하세요 #a991102 입니다.
오늘은 상속부터 import 를 설명해드리겠습니다.
부족한점은 말씀해주시면 고치겠습니다.

  1. 상속
  • 상속이란 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것이다.
    상속을 통해서 클래스를 작성하면 보다 적은 양의 코드로 새로운 클래스를 작성할 수 있고 코드를 공통적으로 관리할 수 있기에 코드의 추가 및 변경이 매우 용이하다.

  • 상속은 어떻게하느냐 ?
    아주간단하다 작성하고자하는 클래스 이름뒤에 상속받고자 하는 클래스 이름을 키워드
    extends 와 함께 서주기만 하면된다.

class Child extends Parest{

내용

}

예를들어 보았습니다. 간단하죠 ??
그럼다음으로 ~

이두클래스는 서로 상속 관계에 있다고 하며, 상속해주는 '클래스를 조상 '클래스라고하며
상속 받는 클래스를 '자손 클래스' 라고한다.

  • 조상클래스 : 부모클래스, 상위 클래스, 기반클래스 라고 불린다.
  • 자손 클래스 : 자식클래스, 하위 클래스, 파생된 클래스 라고 불린다.

  • 생성자와 초기화 블럭은 상속되지 않는다. 맴버만 상속된다.
  • 자손 클래스의 맴버 개수는 조상 클래스보다 항상 같거나 많다.

ex)

package 삼월이십육일;

class Tv {
    boolean power ; //전원상태(on/off)
    int channel;
    
    void power() { power = !power;}
    void channelUp() { ++channel;}
    void channelDown() {-- channel;}
}

class CaptionTv extends Tv{
        boolean caption;
        void displayCaption(String text) {
                if(caption){
                        System.out.println(text);
                }
        }
}
class CaptionTvTest {
    public static void main(String args[]) {
            CaptionTv ctv = new CaptionTv();
            ctv.channel = 10;
            ctv.channelUp();
            System.out.println(ctv.channel);
            ctv.displayCaption("Hello world1");
            ctv.caption = true;
            ctv.displayCaption("Hello world1");
    }
}



TV 클래로부터 상속받고 기능을 추가하여 CaptionTv 클래스를 작성하였다.
맴버변수 caption은 캡션 기능의 상태를 저장하기위한 boolean 형 변수이고,
displayCaption(String text) 은 매개변수로넘겨받은 문자열을 캡션이 켜져 있는경우 에만
화면에 출력한다.

1.2 클래스간의 관계 - 포함관계

  • 지금까지 상속을 통해 클래스 간에 관계를 맺어주고 클래스를 재사용하는 방법에 대해서
    알아보았습니다.
    상속 이외에도 클래스를 재사용하는 또다른 방법이 있는데 그것은 클래스 간에
    포함 관계를 맺어주는 것입니다. 클래스 간의 포함관계를 맺어주는 것은
    한 클래스의 맴버변수로다른 클래스 타입의 참조변수를 선언하는 것을 뜻한다.

ex)


class Point {
int x;
int y;
}


class Cicle{ -------> class Cicle{
int x;              -------> Point c = new Point();        
int y;              -------> int r;
int r;               -------> }
}

이런식으로 변경할수 있습니다.

1.3 클래스 간의 관계 결정하기

  • 클래스를 작성하는데 있어서 상속관계를 맺어줄 것인지 포함관계를 맺어줄
    것인지 결정하는 것은 때때로 혼돈스러울수 있다.
class Cicle {
Point c = new Point();
int r;
}
|
|
|
class Cicle extends Point {
int r;
}

두경우를 비교해 보면 cicle클래스를 작성하는데 있어서 Point클래스를 포함시키거나
상속받도록 하는 것은 결과적으로 별 차이가 없어 보인다.
그럴때는 이렇게 해보자

  • 상속관계 : ~은 ~이다 (is ~a)
  • 포함관계 : ~은 ~ 을 가지고 있다.(jas~ a)

몇가지를 더 예르 들면, Car 클래스와 SportsCar 클래스는 SportsCar는 Car 이다
와같이 문장을 만드는것이 더 옳기 때문에 두클래스는 Car 클래스를 조상으로
하는 상속 관계를 맺어 주어야 한다.

Card 클래스와 Deck 클래스는 Deck는 Card 를 가지고 있다.
와같이 문장을 만드는 것이 더 옳기 때문에 Deck 클래스에 Card클래스를
포함시켜야한다.

1.4 단일상속

  • 다른 객체지향언어인 c++ 에서는 여러 조상클래스로부터 상속받는 것이 가능한
    '다중상속' 을 허용하지만 자바에서는 단일 상속만을허용한다.
    그래서 하나 이상의 클래스로부터 상속을 받을 수 없다.
    예를들면 TV 클래스와 VCR 클래스가 있을때 이 두클래스로부터 상속을 받는
    TVCR 클래스는 작성할 수 없다.
    그래서 TVCR 클래스는 조상클래스로 TV 클래스와 VCR 클래스 중
    하난만 선택해야 한다.
/*package 삼월이십육일;



class Tv {
    boolean power ;
    int channel;
    
    void power() { power = !power;}
    void channelUp() { ++channel;}
    void channelDown() { --channel;}
}

class VCR{
    boolean power;
    int counter = 0;
    void power() { power = !power}
    void play()  { 내용생략} 
    void play(){ 내용생략}
    void stop(){ 내용생략}
    void rew(){ 내용생략}
    void ff(){ 내용생략}
    
}
class TVCR extends Tv {
    VCR vcr = new VCR();
    int counter = vcr.counter;
    
    void play() {
            vcr.play();
    }
    void stop(){
        vcr.stop();
    }
    void rew() {
        vcr.rew();
    }
    void ff() {
        vcr.ff();
    }
}

이런식으로 단일 상속을 하실수 있습니다.

1.5 Object 클래스 - 모든 클래스의 조상

  • Object 클래스는 모든 클래스 상속계층도의 최상위에있는조상클래스이다.
    다른 클래스로 부터 상속 받지 않는 모든 클래스 들은 자동적으로
    Object 클래스로부터 상속받게 함으로써 이것을 가능하게한다.

여기는 간단하게 하고 넘어가겠습니다.~

2.1 오버라이딩
조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것을 오버라이딩이라고한다.
상속받은 메서드를 그래도 사용하기도 하지만, 자손 클래스를 자신에 맞게
변경해야하는 경우 가 많다. 이럴 때 조상의 메서드를 오버라이딩한다.

  • 오버라이딩 조건

자손클래스에서 오버라이딩하는 메서드는 조상클래스 메서드와
- 이름이 같아야한다.
- 매개변수가 같아야 한다.
- 반환타입이 같아야 한다.


  • 오버로딩 VS 오버라이딩

오버로딩과 오버라이딩은 서로 호동하기 쉽지만 사실 그 차이는 명백하다.
오버로딩은 기존에 없는 새로운메서드를 추가하는 것이고,
오버라이딩은 조상으로부터 상속받은 메서드의 내용을 변경하는 것이다.

2.2 super

super 은 자손 클래스에서 조상 클래스로부터 상속받은 맴버를 참조하는 데 사용되는
참조변수이다.

package 삼월이십육일;

public class SuperTest {
    public static void main(String args[]) {
            Child c = new Child();
            c.method();
    }
}

class Parent{
    int x= 10;
}
class Child extends Parent {
        void method() {
                System.out.println("x :" +x);
                System.out.println("this.x :" + this.x);
                System.out.println("super.x:" + super.x);
        }
}
//이 경우 x, this.x , super.x 모두 같은 변수를 의미하므로모두 같은 값이 출력되었다.

ps - Object클래스를 제외한 모든 클래스의 생성자 첫 줄에는 생성자,this() 또는
super(), 를 호출해야한다. 그렇지 않으면 컴파일러가 자동적으로
super().;를 생성자의 첫 줄에 삽입한다.

2.3 import 선언

일반적인 소스파일 의 구성은 다음 순서로 되어있다.

  1. package문
  2. import 문
  3. 클래스 선언
package 삼월이십육일;

import java.util.Date;
import java.text.SimpleDateFormat;

public class ImportTest {
    public static void main(String args[]) {
            Date today = new Date();
            
            SimpleDateFormat date = new SimpleDateFormat("yyyy/MM/dd");
            SimpleDateFormat time = new SimpleDateFormat("hh:mm:ss a");
            
            System.out.println("오늘 날짜는 "+date.format(today));
            System.out.println("오늘시간은 " +time.format(today));
    }
}

이상으로 길고 길었던 10번째 개발일지를 마치겠습니다
긴글인데 봐주신분들 진심으로 감사드립니다.