Polymorphism

JAVA/in 기초 2014. 2. 3. 00:02

다형성이란 하나로 여러가지 일을 하는 것을 이야기 한다.



상속과 관련된 다형성의 기법들

 - 인터페이스(interface)

 - 오버라이딩(Overriding)

 - 추상 클래스(Abstract Class)

 - 추상 메소드(Abstract Method)

 - 다운캐스팅(Downcasting)

 - 업케스팅(Upcasting)

*예를 들자면, 객체지향을 이야기 한다. 객체(Object)는 모든 형태로 변환(캐스팅)이 가능 하다


  • Abstract Class & Abstract Method

추상 메소드
 - 메소드 몸체가 없는 메서드를 추상 메서드라고 한다.
 - 메소드 선언부에 abstract 키워드를 사용해야 한다.

//일반 메소드
public void sayHello(){}

//추상 메소드
public abstract void sayHi();
추상 클래스
 - 몸체 없는 메서드를 포함한 클래스를 추상 클래스라고 한다.
 - 클래스의 선언부에 abstract키워드를 사용해야 한다.

//추상 클래스
public abstract class CallHello{
//추상 메소드
public abstract void sayHi();
}

추상 클래스 특징
 - 완전한 클래스가 아니기 때문에 추상 클래스를 이용해서 객체를 생성 할 수 없다.
 - 추상 클래스를 완전한 클래스로 만들기 위해서 상속의 기법을 이용해서 모든 추상 메소드를 구현 하면 된다.

abstract 키워드
 - 추상 메소드는 메서드 앞부분에 abstract 키워드를 붙여야 한다.
 - 추상 메서드를 하나라도 포함하고 있다면 클래스 앞부분에 abstract 키워드를 붙여야 한다.

* 추상 메소드를 포함 하지 않은 추상 클래스의 경우 무조건 상속받도록 하기 위해서 사용한다.

  • Interface
인터페이스란 골격만 가지고 있는 클래스를 이야기 한다.
인터페이스 VS 추상 클래스 차이점
 
 - 추상 클래스는 일부분이 추상 메소드이다.
 - 인터페이스는 추상 메소드 만으로 이루어 진다.

 - 추상 클래스는 extends를이용해서 추상 메소드를 구현 한다.
 - 인터페이스는 inplements를 이용해서 추상 메소드를 구현한다.

인터페이스 특징
 - 모든 메소드는 묵시적 public abstract이다.
 - 인터페이스는 객체를 생성 할 수 없다.
 - 인터페이스에서 멤버변수를 선언하면 기본으로 public static final(상수) 형식이 된다.

자바의 다중 상속
 - 단일 상속을 기본으로 한다.
 - 변칙적으로 다중 상속을 지원하기 위해서 인터페이스를 이용한다.
 - 인터페이스는 기능적인 측면에서 순간적으로 구현해서 사용하기 때문에 복잡한 상속구조에 얽매이지 않는다.

* 추후 디자인 패턴에서 알아보자.

  • Upcasting
특정 객체가 하위 클래스의 형에서 상위 클래스의 형으로 캐스팅 되는 것이며 형만 정확하다면 묵시적으로 캐스팅 된다.

기본 데이터 타입의 캐스팅
 - 일반적으로 캐스팅의 기본 원리는 작은 것이 큰 것으로 되는 것이다.
 - 작은 크기의 데이터는 큰 크기의 데이터로 쉽게 들어 갈 수 있다.
//자동 캐스팅
byte b = 12;
int i = b;

//오류 발생
int i = 200;
byte b = i;
//해결을 위해 강제로 캐스팅 한 경우 오버 플로우 발생
byte b = (byte)i;

많이 사용 되는 업캐스팅의 예
 - 상위 클래스로의 업캐스팅
 - 추상 클래스로의 업캐스팅
 - 인터페이스로의 업캐스팅

업캐스팅시 주의 사항
 - 상위 클래스의 형에 존재하는 메소드만을 상위 클래스의 이름으로 호출 할 수 있다.
 - 하위 크래스에만 존재하는 메소드는 상위 클래스의 이름으로 호출 할 수 없다.

인터페이스를 사용하는 목적
 - 자바의 인터페이스는 사용자와의 상호작용을 위해서 사용한다.
 - 사용자에게 인터페이스만 공개했을 때 해당 객체가 다양한 기능을 보유하더라도 인터페이스에 해당하는 기능만을 사용하게 할 수 있다.
 - 인터페이스로 작업을 제한했기 때문에 해당 객체를 잘못 사용할 오류를 막는다.

  • Downcasting
업캐스팅한 것을 다시 원래의 형으로 복원 시켜주는 작업

다운캐스팅의 특징
 - 업캐스팅된 것만 다운 캐스팅 시킬 수 있다.
 - 다운 캐스팅은 강제 캐스팅을 원칙으로 한다.

다운 캐스팅의 형 확인 방법

Top t = new Middle();

//다운 캐스팅
Middel m = (Middle)t;

//instanceof 키워드를 이용한 다운 캐스팅
if(t instanceof Middel){//형확인
 Middel m = (Middle)t; 
}else{
 System.out.println("형이 맞지 않습니다.");
}


* 여기까지 다형성에서 이용되는 기술에 대해 알아 보았습니다.


* 다음은 예제 입니다.


예제 내용 : 고객과 음식의 개념에서 다형성을 이용하여 샘플을 만들 었습니다.

예제 파일 : 


src.zip



'JAVA > in 기초' 카테고리의 다른 글

Formatting 기능  (0) 2014.02.21
예외처리(Exception)  (0) 2014.02.21
컬랙션(Collection)과 맵(Map) 계열  (0) 2014.02.21
Polymorphism  (0) 2014.02.03
Overloading, Constructor, Inheritance, Overriding, this, super  (0) 2014.02.02
Java in Memory  (0) 2014.01.19
Posted by lahuman

댓글을 달아 주세요

  • Overloading
오버로딩이란 하나의 메소드 이름에 여러 개의 메소드를 만들 수 있게 해주는 기법이다.

오버로딩의 정의
 - 하나의 이름으로 여러개의 메서드를 만드는 기법

오버로딩 메소드를 만드는 규칙
 - 반드시 매개변수의 개수나 매개변수의 형이 달라야 한다.

오버로딩을 사용하는 이유
 - 해당 클래스의 메서드를 사용할 때 사용자의 편리를 위해서
 - 매서드의 이름 하나로 여러 가지 작업에 대처할 수 있다.

* 오버로딩은 컴파일러가 발전하면서 등장한 기술이다. 컴파일러 차원에서 메서드의 이름을 자동으로 바꾸어 주기 때문에 사용자가 펴리하게 이것을 사용하는 것이다.

//원본 소스
int plus(int a, int b);
float plus(float a, float b);
double plus(double a, double b);

//컴파일된 소스
int plus_a(int a, int b);
float plus_b(float a, float b);
double plus_c(double a, double b);
  • Constructor
생성자란 객체의 메모리를 생성할 때 함께 호출디는 메소드이다.

생성자의 정의
 - 객체의 생성고 동시에 자동으로 호출되는 메서드

디폴트 생성자
 - 생성자가 없는 클래스를 위해서 컴파일러는 매개변수를 가지지 않는 디폴트 생성자를 자동으로 만들어 준다.
 - 생성자가 없을 경우에만 컴파일러에 의해서 생성된다.

생성자의 특징
 - 생성자는 리턴타입이 없다.
 - 생성자의 이름은 클래스의 이름과 동일하다
 - 생성자느 객체의 메모리가 생성되 직후에 호출된다.

* 생성자는 사용자가 함부로 호출할 수 있는 메서드가 아니다. 대부분 new 와 함께 사용되며 예외적으로 생성자를 호출 할 수 있는 경우는 this와 super를 이용한 경우 뿐이다.


//기본 생성자 호출
TopConstructor tc = new TopConstructor();

//매개변수를 가진 생성자 호출
TopConstructor tc = new TopConstructor("lahuman");
생성자의 특징2
 - 디폴트 생상자를 재정의 할 수 있다.
 - 사용자가 다른 생성자를 정의 하였다면 시스템에서 제공하는 생성자는 사용할 수 없다.
 - 생성자도 오버로딩 할 수 있다.

  • Inheritance
상속이란 미리 만들어 둔 클래스를 다시 이용하는 방법을 말한다.
상속이란?
 - 하위 클래스가 상위 클래스를 상속받았을 때, 하위 클래스는 상위 클래스의 모든 권한을 갖게 된다.

상속과정에서 생성자의 호출
 - 생성자는 상속되지 않는다.
 - 하위 클래스의 객체를 만들 때, 상위 클래스에서 하위 클래스 순으로 생성자가 차례대로 호출된다.

* 상속 과정에서 상위 클래스의 메모리가 생성되지 않느다면, 자식 레벨의 메모리는 생성되지 않는다. 이러한 이유에서 하위 객체를 만들면 상위 클래스의 생성자가 먼저 호출된다.

다중상속
 - 자바에서는 원칙적으로 다중 상속을 허용하지 않는다.
 - 인터페이스(Interface)를 이용해서 변칙적으로 다중 상속을 지원하고 있다.

접근 제한자
 - public : 모든 클래스에서 접근 가능
 - private : 자신의 클래스에서만 접근 가능
 - protected : 상속관계에서만 접근 가능
  • Overriding

오버라이딩이란 상위 클래스에서 있는 메서드와 똑같은 메서드를 하위 클래스에서 다시 만드는 행위를 말한다.

//상위 클래스
public class TopConstructor {
    private String name = "";
    private String address = "";
    private int age = 0;

    public TopConstructor() {
        name = "lahuman";
        address = "대한민국";
        age = 34;
    }

    public TopConstructor(String n, String a, int g) {
        System.out.println("Call TopConstructor(String n, String a, int g)");
        name = n;
        address = a;
        age = g;
    }

    public String getData() {
        String x = name + "," + address + "," + age;
        System.out.println(x);
        return x;
    }
}


//하위 클래스
public class MiddleConstructor extends TopConstructor {

    public MiddleConstructor(String n, String a, int g) {
        super(n, a, g);
        System.out.println("Call MiddleConstructor(String n, String a, int g)");
    }

    @Override
    public String getData() {
        return super.getData() + " 메롱";
    }

    public static void main(String[] args) {
        TopConstructor tc = new MiddleConstructor("lahuman", "대한민국", 22);
        String result = tc.getData();
        System.out.println(result);
    }
}


실행 결과

Call TopConstructor(String n, String a, int g)

Call MiddleConstructor(String n, String a, int g)

lahuman,대한민국,22

lahuman,대한민국,22 메롱


* getData()의 결과가 상위 클래스의 getData가 아닌 하위 클래스의 getData가 호출된다.

상위 메서드 이름으로 하위 메서드 호출

 - 하위 클래스의 메모리를 상위 클래스로 캐스팅 했을 때 그리고 메서드가 재 정의 되었을때, 상위 클래스의 객체명으로 메소드를 호출하면 재정의된 메서드가 호출된다.

 - 자바의 모든 메서드에 대해서 위와 같은 사항을 제공한다.


캐스팅

 - 다운캐스팅 : 상위 클래스의 메모리가 하위 클래스로 캐스팅되는 것을 말한다. 

 - 업캐스팅 : 하위 클래스의 메모리가 상위 클래스로 캐스팅되는 것을 말한다.


오버라이딩의 의미

 - 상위 클래스에서 가지고 있던 기능을 하위 클래스에서 개선하겠다는 의미



  • this 
this의 개념
 - 자기 자신을 참조하는 가상의 참조 변수
 - 컴파일러가 자동으로 넣어 주는 멤버 메서드의 첫 번째 매개변수

this의 기능1
 - 매서드의 매개변수와 클래스의 멤버 필드가 동일 하다면 구분할때 사용한다.
 - 필요 없다면 this 키워드는 사용하지 않아도 무방하다.

this의 기능2
 - 클래스 내부에서 this를 사용하게 되면, 객체가 생성된 후 할당된 메모리의 참조값을 갖게 된다.
 - 언젠가 생성될 내 메모리의 참조값

this의 기능3
 - this를 이용해서 생성자 내에서 다른 생성자를 호출 할 수 있다.
 - 생성자를 재 사용할 수 있다.
 - 생성자에서 다른 생성자를 호출할 때 생성자 호출은 제일 윗부분에 사용해야 한다.

this를 이용해서 생성자를 호출할 때의 규칙
 - 반드시 생성자 내에서 다른 생성자를 호출 해야 한다.
 - 생성자에서 this를 이용한 생성자 호출은 어떠한 작업보다도 먼저 선행되어야 한다.
 - 즉 this를 이용한 생성자 호출 앞에는 어떠한 구문도 사용할 수 없다.

*예제 코드
public class SampleThis {
    private int age = 0;
    private String name = "";

    public SampleThis() {
        this(10, "lahuman");
    }

    public SampleThis(int age, String name) {
        this.age = age;
        this.name = name;
    }

    public String getData() {
        return this.name + "," + this.age;
    }

    public SampleThis getSampleThis(){
        return this;
    }

    public static void main(String[] args){
        SampleThis st = new SampleThis();
        System.out.println(st.getData());

        st = st.getSampleThis();
        System.out.println(st.getData());
    }
}

  • super
상위 클래스를 참조할 수 있는 가상의 참조 변수
super.메소드
 - 자식 클래스 내에서 상위 클래스를 참조하는 가상의 참조변수
 - 무시당한 상위 클래스의 메서드를 사용하고자 할 때 사용한다.
 - 클래스 내에서마 사용 가능하다.

super()
 - 상위 클래스의 생성자 호출


* 상속 예제를 참조 하세요.

'JAVA > in 기초' 카테고리의 다른 글

Formatting 기능  (0) 2014.02.21
예외처리(Exception)  (0) 2014.02.21
컬랙션(Collection)과 맵(Map) 계열  (0) 2014.02.21
Polymorphism  (0) 2014.02.03
Overloading, Constructor, Inheritance, Overriding, this, super  (0) 2014.02.02
Java in Memory  (0) 2014.01.19
Posted by lahuman

댓글을 달아 주세요

이번 시간에는 intellij 라는 IDE 툴에 대해서 알아 보려고 합니다.


우선 기초 셋팅과 정보가 필요할 것이라 생각 합니다.


그에 대한 참조는 아래 글을 꼭 한번 읽어 보기를 추천 합니다.


김태기 님의 포스트 :

위의 셋팅을 따르셨다면 현재 Git 을 로컬에 설치 하는 부분 까지 하셨을 것이라고 생각 합니다.

그럼 우선 IntelliJ를 실행 후 새로운 Project를 생성 합니다.
(위 포스트의 추천 대로 저는 empty Project를 생성 하였습니다.)

그리고 java 모듈을 생성합니다.
(이부분은 꼭 똑같이 하실 필요는 없습니다.)

그리고 File -> Settings -> Plugins 에서 Browse repositories... 를 선택 합니다.


그림1


검색창에 Bitbucket를 입력 후 가장 상위에 있는 Bitbucket VSC Integration 을 설치 합니다.
그림2

설치가 다 되셨으면 IntelliJ를 재시작을 한 이후, Settings 에서 Bitbucket를 선택하고

그림3

 본인의 계정 정보를 입력 후 테스트를 클릭 합니다.

그림4


위의 셋팅까지 완료 되셨다면 지금 50%까지 오신 겁니다.



자 이제 마지막으로 연동관련 셋팅을 하게 되겠습니다.

우선 모듈 폴더로 이동 이후, 그곳에서 마우스 오른쪽 키를 누르시고, 

그림5


git bash(COMMAND)로 들어간 이후, 아래와 같이 입력합니다.(가운데는 오타 입니다. -_-;) Git repository 주소는 www.bitkucket.org 에서 확인 할 수 있습니다.

그림6


$ git init
$ git remote add origin https://lahuman@bitbucket.org/lahuman/nio2study.git


자 다시 IntelliJ로 돌아와서, Setting에서 Version Controller 로 이동을 하면, 다음과 같은 메시지를 만나게 됩니다.


그림7

여기서 add Root를 하면 됩니다.




디렉토리, 또는 파일에서 마우스 오른쪽 키를 누르고 Git -> ADD를 선택합니다.

그림8


디렉토리, 또는 파일에서 마우스 오른쪽 키를 누르고 Git -> Commit Directory를 선택합니다.

그림9


Commit & pushed 를 선택 한다.

그림10


혹시나 오류 상자를 만나게 되더라도 그냥 Commit 하면 된다.

그림11


새로운 프로젝트의 경우는 branch를 이용하면된다.


그림12


접속 패스워드를 입력 하면된다.

그림13


마지막으로 http://bitbucket.org 로 이동하여 자신의 Git 저장소를 확인 합니다.


림14



사실 IntelliJ와 Git은 써본적이 없어서 지금 헤매는 중입니다.


다행이 좋은 분들께서 많은 자료를 준비해주셔서(?) 한발자국씩 앞으로나아가는 기분 이네요.




아래 참고 문서를 참조 하면 조금더 도움이 될꺼라고 생각합니다.


감사합니다.


추가 참조 : 

설정 관련 

https://www.youtube.com/watch?v=klfLSRXUOzY

SVN 능력자를 위한 GIT 개념 가이드

http://www.slideshare.net/einsub/svn-git-17386752?fb_action_ids=641687625896916&fb_action_types=slideshare%3Afavorite&fb_source=other_multiline&action_object_map=%5B304992296295587%5D&action_type_map=%5B%22slideshare%3Afavorite%22%5D&action_ref_map=%5B%5D

Posted by lahuman

댓글을 달아 주세요