반응형

다형성 Polymorphism 

자바에서 다형성이란 하나의 동작을 여러 방식으로 할 수 있게해주는 개념으로 정의하고있습니다.

 Polymorphism(폴리모피즘)는 그리스어 poly와 morphs는 그리스어에서 파생되어 만들어진 단어입니다. poly는 다수를 의미하고 morphs는 형태를 의미합니다.

그래서 폴리모피즘의 뜻이 다형성이 되는거라고 하네요.(이하 polymorphism)

자바에는 두가지 타입의 polymorphism이 존재하는데, 컴파일타임 polymorphism과 런타임 polymorphism이 있습니다. 

그리고 우리는 오버로딩과 오버로드를 통해 polymorphism을 구현할 수 있습니다!

만약 우리가 static method를 오버로드했다면 컴파일타임 polymorphism의 예입니다.

런타임 polymorphism의 예를 살펴봅시다.


1) Runtime Polymorphism in JAVA.

Runtime Polymorphism 혹은 Dynamic Method Dispatch 는

오러라이드된 메소드를 컴파일에서보다는 런타임에서 해결하는 프로세스입니다.

이 과정에서, 오버라이드된 메소드는 superClass의 변수 참조를 통해 호출됩니다.

메소드가 호출되는 결정은 참조 변수가 참조하는 객체에 기반합니다.


Upcasting(자동타입변환) 

부모클래스 참조 변수가 자식 클래스 객체를 참조할 때 이를, 업 캐스팅! 이라고 합니다.

왜 갑자기 업캐스팅 얘기냐구요? 런타임 다형성을 이해하기위해서 필요하니까요!


런타입 다형성 얘제를 살펴볼게요.

class Bike{  

  void run(){System.out.println("running");}  

}  

class Splender extends Bike{  

  void run(){System.out.println("running safely with 60km");}  

  

  public static void main(String args[]){  

    Bike b = new Splender();  

    b.run();  

  }  

}

output = running safely with 60km

 

Bike와 Splender라는 클래스를 만들고 Splender 클래스가 Bike를 상속했고 run()메소드를 오버라이드했습니다.

여기서 오버라이드된 run()메소드를 부모 클래스의 참조변수라고 부릅니다.

하위 클래스 객체를 참조하고 하위 클래스 메소드가 상위 클래스 메소드를 무시하므로 

런타임에 하위 클래스 메소드가 호출됩니다.

은행 예를 들어볼까요? 

package polymorphism;

class Bank{  

float getRateOfInterest(){return 0;}  

}  

class SBI extends Bank{  

float getRateOfInterest(){return 8.4f;}  

}  

class ICICI extends Bank{  

float getRateOfInterest(){return 7.3f;}  

}  

class AXIS extends Bank{  

float getRateOfInterest(){return 9.7f;}  

}  

class TestPolymorphism{  

public static void main(String args[]){  

Bank b;  

b=new SBI();  

System.out.println("SBI Rate of Interest: "+b.getRateOfInterest());  

b=new ICICI();  

System.out.println("ICICI Rate of Interest: "+b.getRateOfInterest());  

b=new AXIS();  

System.out.println("AXIS Rate of Interest: "+b.getRateOfInterest());  

}  

}

output = 

SBI Rate of Interest: 8.4

ICICI Rate of Interest: 7.3

AXIS Rate of Interest: 9.7

 

이자율을 가져오는 Bank라는 클래스가 있다고 가정합시다.

하지만 은행마다 이자율이 조금씨 다를수도 있습니다. (카뱅이 그리 좋다죠..?)

도형을 예로 들면 이렇게 됩니다.

package polymorphism;

class Shape{  

void draw(){System.out.println("drawing...");}  

}  

class Rectangle extends Shape{  

void draw(){System.out.println("drawing rectangle...");}  

}  

class Circle extends Shape{  

void draw(){System.out.println("drawing circle...");}  

}  

class Triangle extends Shape{  

void draw(){System.out.println("drawing triangle...");}  

}  

class TestPolymorphism2{  

public static void main(String args[]){  

Shape s;  

s=new Rectangle();  

s.draw();  

s=new Circle();  

s.draw();  

s=new Triangle();  

s.draw();  

}  

}

output = 

drawing rectangle...

drawing circle...

drawing triangle...



 

JAVA Runtime Polymorphism with DataMember

오버라이드된 메소드는 데이터멤버가 아닙니다. 그래서 런타임 다형성은 데이터 멤버로 만들어질 수 없습니다.

아래의 예제를 보면 두개의 클래스가 speedlimit이라는 데이터멤버를 가지고있고 

자식객체를 참조하고있는 부모클래스 참조변수를 통해 데이터멤버에 접근해볼겁니다.

오버라이드되지않은 데이터멤버에 접근한다면, 부모클래스의 데이터멤버에 접근하게될겁니다. 

왜냐면 재정의되지않았기 떄문에 순수호출이 되는거니까요.


package polymorphism;


class Bike{  

 int speedlimit=90;  

}  

class Honda3 extends Bike{  

 int speedlimit=150;  

  

 public static void main(String args[]){  

  Bike obj=new Honda3();  

  System.out.println(obj.speedlimit);  

}

 }

output = 90.  


Java Runtime Polymorphism with Multilevel Inheritance.

다중레벨상속과 런타임 다형성에 대해서 간단하게 알아봅시다.

package polymorphism;


class Animal {

void eat() {

System.out.println("Animal: eating");

}

}


class Dog extends Animal {

void eat() {

System.out.println("Dog: eating fruits");

}

}


class BabyDog extends Dog {

void eat() {

System.out.println("BabyDog: drinking milk");

}


public static void main(String args[]) {

Animal a1, a2, a3;

a1 = new Animal();

a2 = new Dog();

a3 = new BabyDog();

a1.eat();

a2.eat();

a3.eat();

}

} output =

Animal: eating

Dog: eating fruits

BabyDog: drinking milk

감이 오시나요?

BabyDog이 Dog를 상속하고 Dog가 Animal을 상속합니다.

BabyDog이 가지고있는 오버라이드 메소드는 없기때문에 부모클래스의 eat()메소드를 가져옵니다.



반응형
by 발전소장 에르 :) 2017. 8. 9. 10:18
반응형

자바 Final Keyword 1편 보기. http://loganstory.com/229 

정리해보자면,

final 키워드는 변수,메소드,클래스에 사용될 수 있는데,

final은 오버로드와 오버라이드 그리고 상속이 제한된다는 점

하지만 순수호출은 가능하다는 점!

기억하고 계시나요?

그렇다면 맨 처음에 설명드렸던 초기화되지않은 파이널 변수에 대해서 알아보도록하죠.

Q) Blank or Uninitialized final variable이 무엇인가요?

A)선언되었을떄 초기화되지않은 파이널 변수를 Blank final variable이라고합니다.

만약, 여러분이 객체가 생성될 때 값이 초기화되고 바뀌지않는 변수를 만들고자 할 때 Blank final variable을 사용하시게 될텐데요.

(직원 고유번호, PIN번호 같은 곳에 쓰일 수 있다고합니다)

Blank final variable은 생성자 안에서만 초기화될수 있습니다.

이해를 도울 예제를 살펴보시죠.

blank final variable( 빈 파이널 변수)는 이렇게 생겼습니다.

          1. class Student{  
          2. int id;  
          3. String name;  
          4. final String PAN_CARD_NUMBER;  
          5. ...  
          6. }  

 

그럼 빈 파이널 변수를 초기화시킬 수 있을까요?

 생성자를 통해서만 가능합니다.

package fianl_keyword;


class Bike10{  

  final int speedlimit;//blank final variable  

   

  Bike10(){  

  speedlimit=70;  

  System.out.println(speedlimit);  

  }  

 

  public static void main(String args[]){  

    new Bike10();  

}  

}  

자. 살펴봅시다!

필드에 blank final variable을 선언해줬고,

생성자에서 speedlimit의 값을 70으로 초기화했습니다.

그리곤 메인메소드에서 찍어봤는데요.

70이 뙇!

그렇단 말은 생성자의 변수 초기화구문이 적용됬다는게 증명이 된거겠죠.

그리고 final 키워드앞에 static이 올수도있습니다.

그렇다면 static blank final variable을 생성할수도있다는 말이되지요.

허나, static block에서만 초기화가 가능합니다.

예제를 살펴보시죠.

package fianl_keyword;

class A{  

  static final int data;//static blank final variable  

  static{ data=50;}  

  public static void main(String args[]){  

    System.out.println(A.data);  

 }  

}

result = 50  

필드에 static blank final variable 생성해주고,

static{} 블럭안에서 해당 필드를 초기화해줍니다.

그리고 메인메소드에서 접근자 .(dot)을 통해서 호출을 해보면

50이라는 결과값이 나옵니다.

Q)  final 매개변수는 뭐에요..?

A) 쉽습니다. 메소드의 매개변수에 final키워드를 사용해주시면됩니다.

그럼 한번 입력받은 매개변수는 변경할 수 없는 상수가 되버리죠.


cube 메소드의 매게변수에 final int n 을 줍니다. 그리고 

연산식으로 n 변수를 연산해봅시다.


그리고 메인메소드에서 객체를 생성하고 매개변수로 5를 주면?


컴파일러 에러가 두둥!

에러를 해석해봅시다.package fianl_keyword;


class Bike11{  

  int cube(final int n){  

  n=n+2;//can't be changed as n is final  

  n= n*n;  

  }  

  public static void main(String args[]){  

    Bike11 b=new Bike11();  

    b.cube(5);  

}  

}  


Exception in thread "main" java.lang.Error: Unresolved compilation problems: 

This method must return a result of type int

The final local variable n cannot be assigned. It must be blank and not using a compound assignment

The final local variable n cannot be assigned. It must be blank and not using a compound assignment


at fianl_keyword.Bike11.cube(Bike11.java:4)

at fianl_keyword.Bike11.main(Bike11.java:10)



두둥... 에러내용을 해석해보자면 이렇습니다

"야, 사용자야 생각을 해보자.. 니가 매개변수에 final 줬지?

니가 값 바뀌는게 싫어서 매개변수를 상수로 정의했으면서 왜

그 상수로 연산식을 포함한 메소드를 실행시키는건데? 

돌아가 안되" 라고 하네요..

그럼 생성자에 final 키워드를 사용할 수 있을까요?

생성자는 상속되지않기때문에 final키워드를 사용할 수 없습니다..!!

모르시는 부분이나 애매한 부분은 댓글남겨주시면 감사하겠습니다 :)





반응형
by 발전소장 에르 :) 2017. 8. 8. 01:08
반응형

Final Keyword In Java!!


fianl은 유저에게 엄격할 뿐더러 오직  변수, 메소드,  클래스총 3곳에 사용될 수 있습니다!

final 키워드는 변수와 함께 사용될 수 있고, 

값이 없는 빈 변수 혹은 초기화되지않은 빈 파이널 변수에 사용될 수 있습니다.

파이널 변수는 생성자에서만 초기화시킬 수 있고, 

빈 파이널 변수(Blank Final Variable)은 static이 될 수 있고 static 블럭안에서 초기화 될 수 있습니다.

감이 안오신다면 더 자세히 알아보도록할까요.

1) FINAL VARIABLE 

한번 선언하면 값을 바꿀 수 없습니다.

SWIFT에서 let의 역할을 하고있는것같네요.

예제를 한번 살펴봅시다.

Bike9클래스를 만든 후 필드에 speedlimit란 정수타입 변수에게 90의 초기값과 final키워드를 붙여줍니다.

그리고 run() 메소드에 위에서 초기화했던 speedlimit값을 재초기화하는 구문을 넣습니다.

Bike9클래스안에 main메소드를 넣고 인스턴스를 생성하고 매소드를 실행해봅시다.

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 

The final field Bike9.speedlimit cannot be assigned


at fianl_keyword.Bike9.run(Bike9.java:7)

at fianl_keyword.Bike9.main(Bike9.java:12)


2번째 줄 보이시나요?  BIke9.speedlimit는 재정의될 수 없습니다.!

네, 맞아요 final이 걸리면 게다가 초기화가 된 채로 선언되면 바꿀수없어요.. 생성자도 아닌 메소드에선 더더욱..

2) Final Method

Bike클래스를 정의하고 final 메소드를 선언한다음에 

메인 메소드에서 자식 객체를 생성하여 

자식객체가 부모객체를 오버라이드한 메소드를 실행시켜볼 예정입니다.


Bike클래스를 상속받고 부모클래스의 메소드를 오버라이드했습니다.

그리고 실행해보지요.

두둥..


Exception in thread "main" java.lang.VerifyError: class fianl_keyword.Honda overrides final method run.()V





에러 덩어리네요.

중요한건 맨 위 2줄이라 나머지는 잘랐습니다만,

2번쨰 줄이 가장 중요하네요.

  final 메소드 run()을 오버라이드할 수 없습니다.!

슬슬 이해가 되시나요?

3) final class 

final키워드를 붙힌 Bike클래스를 만들고

final클래스인 Bike를 상속합니다(에러)


Exception in thread "main" java.lang.Error: Unresolved compilation problem: 

Honda cannot be resolved to a type


at fianl_keyword.Bike.main


final클래스를 상속하려고하니 

자바 컴파일러가 " 야, 이거 final이야 상속못해. 돌아가."

라고 합니다. 

Q)그럼, 메소드를 오버라이드하지 못해도 상속받는건 가능한가요?

A)네 가능합니다.!



fianl메소드를 오버라이드하는 건 불가능하지만, 순수 호출은 가능하다는거! 중요하겠지요?

정리해보자면,

final 키워드는 변수,메소드,클래스에 사용될 수 있는데,

final은 오버로드와 오버라이드 그리고 상속이 제한된다는 점

하지만 순수호출은 가능하다는 점!

2편에서 봐요~:)



반응형
by 발전소장 에르 :) 2017. 8. 7. 01:47
반응형

빈도가 되게 높다고는 할 수 없는 부분이지만, 

빼놓을 수도 없는 부분인 인스턴스 초기화 블럭 파트입니다.!

일단 , 쓰임새에 대해서 알아볼까요?


1)     인스턴스 데이터 멤버를 초기화 인스턴스 초기화 블록을 사용합니다.

2)    클래스의 객체가 생성될 마다 인스턴스 초기화 블록이 실행됩니다.


초기화 블럭의 정의 아래와 같습니다.

 

초기화 블럭(initialization block)

클래스 초기화 블럭 : 클래스 변수의 복잡한 초기화에 사용된다. 클래스가 처음 로딩될 한번만 수행된다.

인스턴스 초기화 블럭 : 인스턴스 변수의 복잡한 초기화에 사용된다. 인스턴스가 생성될때 마다 수행된다. (생성자보다 먼저 수행된다.)


Q)아래 코드처럼 개발자 직접 인스턴스 데이터 멤버에 값을 있는데,

굳이 인스턴스 초기화 블럭을 사용하나요?


class bike {

int speed = 100;

}



A) 인스턴스 초기화 블럭을 사용하는가?


인스터스 데이터 멤버에 값을 할당하면서 for 반복문으로 복잡한 배열이나 에러 처리 같은 어떤

작을 수행해야한다고 가정해봅시다.


package instance_initialize_block;


public class InstanceTest01 {

public static void main(String[] args) {

bike7 b1 = new bike7();

bike7 b2 = new bike7();

}


}


class bike7{

int speed;

public bike7() {

System.out.println("speed = " + speed);

// TODO Auto-generated constructor stub

}

{speed = 100;}

}

output=

speed = 100

speed = 100


여기서보면, 

bike7 클래스안에 별도의 {}블럭이 생성되어있고 

 speed = 100;으로 초기화시켜주고있네요.

일단 인스턴스 초기화 블럭의 모양이 저런 모양이구나 하고 넘어가봅시다.

자바에서 동작을 수행할 있는 곳은 세 곳이 있습니다.

  1. 메소드
  2. 생성자
  3. 블럭<<<<

그렇다면, 블럭이 위치한 로컬에 있는 변수의 초기값을 블럭의 내용대로 적용이 된것을 알 수가 있겠죠?

———————

 그렇다면, 인스턴스 블럭과 생성자 중에 무엇이 먼저 실행 될까요?


예제를 살펴보죠,

package instance_initialize_block;


public class InstanceTest02 {

public static void main(String[] args) {

bike8 b1 = new bike8();

bike8 b2 = new bike8();

}

}


class bike8{

int speed;

public bike8() {

System.out.println("생성자가 호출되었습니다.");

//생성자 

}

{System.out.println("인스턴스 초기 블럭이 호출되었습니다.");}

// 인스턴스블럭 

}




bike8이라는 테스트용 클래스를 만든 후 

생성자에 프린트를 찍어줍니다.

그리고 블럭을 삽입해 둘 중 누가 먼저 실행될지에 대해서 테스트해보도록하죠.


메인 메소드를 가지고있는 InstanceTest02 클래스에

bike8클래스 객체를 만들어서 테스트해보도록하겠습니다.

위 상태로 실행시키면, b1이 실행되고 b2가 실행되겠죠.

이때 생성자가 먼저 호출이 될건지, 블럭이 먼저 호출이 될건지 봅시다.



의외로 생성자가 먼저 호출이 된 결과값이네요.

왜그런지 알아볼까요?


실은, 인스턴스 초기화 블럭이 먼저 호출이 되는 것처럼보이지만은,

객체가 생성될때 인스턴스 초기화 블럭이 호출됩니다. ( 거의 동시에)

자바 컴파일러는 첫 문장 super() 키워드 이후에 생성자 안에 있는 인스터스 초기화 블럭을 카피합니다.

그래서 결과값과는 살짝 다르게 생성자를 먼저 호출하는 셈이죠.

아래에 이해를 돕는 예제와 표를 첨부했습니다.

위에 표에서는 숨어있던 super()가 나오네요 !

실행 순서는

super() > instance initialize block > constructor of local 순서가 되겠네요.

bike클래스가 상속받을 parentOfBike클래스를 만들어주고

생성자에 프린트문으로 찍어줍니다.(누가 먼저 호출되는지 구분하기위해서)

별 다른 설명이 없습니다.

실행하였을때 

super()로 부모클래스의 생성자가 호출되고

인스턴스 초기화 블럭에 있던 구문이 실행되고

로컬 클래스에 생성자가 호출되었네요.

이제 이해가 가시나요?

안가신다면 잠시 여유를 가져보는 건 어떨까요?

인스턴스 초기화 블럭은 주된 3가지 규칙에 의해 사용되는데 

아래와 같습니다.

1) 인스턴스 초기화 블럭은 클래스의 인스턴스가 생성될 때 생성됩니다.

2)부모 클래스 생성자를 호출한 후 인스턴스 초기화 블럭이 호출됩니다.

3) 인스턴스 초기화 블럭은 기술된 순서대로 나타납니다.

마지막 예제를 보시죠!

부모 클래스를 만들고~

A를 상속할 B3클래스를 만들어주고~

생성자에 super()키워드를 넣어줍니다.

오버로드한 생성자에 int a라는 매개 변수를 삽입하고

B3클래스 최하단에 인스턴스 초기화 블럭을 선언해줍니다.

그리고는 객체를 만들 때 매개변수를 준 객체와 안준 객체를 

생성하면 어떻게 될까요?

결과값을 보면 이해가 잘 되시나요?

다시한번 되짚어보자면

super() > instance initializer block > constructor of local class.

꼭 기억하시고 열공하시길 바랍니다 :)


반응형
by 발전소장 에르 :) 2017. 8. 6. 18:35
반응형

자바 - super키워드의 마지막 장입니다.

super 키워드의 3개가지 쓰임새를 알아봤었는데요.

1)  super키워드를 이용해서 부모클래스 객체의 변수를 참조하고자할때

2)  super키워드를 이용하여 부모클래스의 메소드를 실행하고자할떄

3) super 키워드는 부모클래스의 생성자를 호출하는데 사용됩니다.


3) super 키워드는 부모클래스의 생성자를 호출하는데 사용됩니다.<<

이제 시작해보죠,


package super_keyword;


public class SuperTest03 {

public static void main(String[] args) {

Dog3 d3 = new Dog3();

}

}

// 여러분이 머릿속으로 컴파일하였을때의 실행값은 어떨거같나요?


class Animal03{

//Animal03-Con

Animal03(){

System.out.println("Animal03 is created");

}

}

// 이전 예제들과의 중복을 피하기위해 Animal03이라는 부모가 클래스를 생성하고

생성자를 줍니다.


class Dog3 extends Animal03{

//Dog-Con

Dog3(){

super();

System.out.println("Dog is created");

}

}

//위와 동일합니다.


그리곤 SuperTest03 통해 실행시켜보기로하죠.



네 맞습니다.

Dog3(){

super();

System.out.println("Dog is created"); }

우리는 Dog3생성자에서 super(); 를 먼저 썻기때문에

우리는 컴파일러한테 

" 야 컴파일러야 내가 Dog3 클래스에 생성자를 니가 자동으로 만들어주지만,

이번엔 내가 따로 명시해서 만들거야. 근데, super();를 넣을거야 

무슨 말인지 알지?"

뭐 대충 이런 뜻입니다.

쉽지요?ㅎㅎㅎㅎㅎㅎ

super()나 this()가 명시되지않았다면, 컴파일러는 자동으로 각 클래스의 생성자에 super()를 자동으로 삽입합니다. 허나, 우리가 못볼뿐!

이번에는 우리가 명시해줬던 super(); 키워드를 빼고!

기본으로 Dog클래스의 객체만 만들어서 실행해봅시다.

잉?! 결과가 똑같네요.

그말인 즉슨 우리가 명시를 하든안하든 컴파일러는 자동으로 명시해준단 말이죠.

다만 에디터에서 안보일 뿐이랍니다.!


그럼 주로 쓰이는 super 키워드의 형태를 한번 알아볼까요?

package super_keyword;


public class SuperTest04 {

public static void main(String[] args) {

EMP emp = new EMP(1, "신입", 2200f);

emp.display();

}

}


class person{

int id;

String name;

person(int id, String name){

this.id = id;

this.name = name;

}

}


class EMP extends person{

float salary;

EMP(int id, String name , float salary){

super(id,name); // 부모의 생성자를 재사용!

this.salary = salary;

}

void display(){

System.out.println("id = " + id + ", name = " + name + ", salary = " + salary);

}

}

부모클래스가 될 person 클래스를 만들고 

필드와 생성자를 만들어줍니다.

person(int idString name){

this.id = id;

this.name = name;

} 여기서 this.를 주는 이유는 person클래스 내의 id를 사용하는거니까 

헷갈려하지마 컴파일러야~ 라고 알려주는 겁니다.

this.를 안붙히면 이클립스는 int id라는 다른 변수를 생성해버리기 때문에

결론적으론 두개의 id가 person클래스 내의 존재하게되는겁니다.

물론 스코프 범위가 다르기 때문에 서로의 충동들 없습니다.


class EMP extends person{

float salary;

EMP(int idString name , float salary){

super(id,name); // 부모의 생성자를 재사용!

                // 코드의 중복을 최소화시키는 것을 늘 고려하기 때문에,

                 //우리는 EMP에서 다시 새로운 변수를 만들지않았습니다.

this.salary = salary;

}

void display(){

System.out.println("id = " + id + ", name = " + name + ", salary = " + salary);

} 어떤값이 나오나 한번 출력해보도록 하죠.


보신바와 같이 id, name은 부모클래스의 필드값들입니다.

코드의 중복을 최소화하고, 손쉽게 재사용할 수 있으며 다형성을 유지하기 위해서 

좀 과장해서말하면 완소키워드라고 할 수 있겠습니다 ㅎㅎㅎ


반응형
by 발전소장 에르 :) 2017. 8. 3. 17:25
반응형

저번에는 super키워드를 이용해 부모클래스의 필드에 접근하면 방법에 대해 다뤄보았습니다.

이번에는 super키워드로 부모클래스의 메소드에 접근하는 방법을 다뤄보도록 합시다.



2) super 키워드는 부모클래스 메소드를 실행할때 사용될 있습니다.


사용하기에 앞서 몇가진 선행조건이 있는데 아래와 같습니다.


 super 키워드는 부모 클래스의 메소드를 실행하기위해 사용될때에는 

자식 클래스와 부모클래스와 똑같은 메소드를 가지고 있어야하고,

부모크래스의 메소드가 자식클래스에서 오버라이드 되어있어야합니다.






반응형
by 발전소장 에르 :) 2017. 8. 3. 09:55
반응형

자바의 SUPER KEYWORD


자바에서 super키워드는 부모 클래스 객체를 참조하는 변수를 참조합니다.

 

하위 클래스의 인스턴스를 생성 때마다, 부모 클래스의 인스턴스가 잠적으로 만들어지며 이는 super 참조 변수에 의해 참조됩니다.



  Super Keyword 쓰임새

  

1.super 부모클래스의 인스턴스 변수로 참조 있습니다.

2.super 부모클래스 메소드를 바로 사용하기위해 사용될 있습니다.

3. super() 부모클래스 생성자를 바로 사용하기위해 사용될 있습니다.


  1. super 부모 클래스 인스턴스 변수를 참조하기위해 사용될


super keyword 부모클래스의 필드나 데이터 멤버에 접근하기 위해 사용할 있는데,

부모클래스와 자식클래스가 같은 이름의 필드를 가질 사용됩니다. 


SuperTest01이라는 클래스를 만들어주세요.


Animal이라는 부모가 될 클래스르 만들고 


자식클래스가될 Dog클래스를 만들고 Animal을 상속합시다.

그리고 찍어볼수있게 리턴 타입이 void인 메소드를 만듭니다.



그리고 메인 메소드를 가진  SuperTest01객체에서

Dog클래스를 생성하고 Dog 객체의 메소드를 호출하고 결과값을 봅시다.!



결과값이 보이시죠? 예상했던 결과인가요?



자세히 들여야본다면,  Animal클래스과 Dog클래스 모두 color라는 공통된 필드가 있는데,

아무런 키워드없이 Dog객체를 생성하고 color 필드를 그냥 찍는다면,

 Dog color값만 나오게될테죠


그렇다고 일일이 Animal클래스를 객체생성하여 사용하기에는 상속의 의미가 없어지고

이를 해결하기위해     super.이라는 키워드를 사용하여

별다른 절차없이 바로 부모클래스의 필드값으로 접근할 있습니다

자바에서는 다중 상속을 막아놨기 때문에 헷갈릴 필요도 없지요.

정말로 진짜 진심으로 다중상속이 필요하다면 인터페이스를 이용하면됩니다.

그리고,  



이해가 잘 되셨나요? 

계속 super keyword의 쓰임새를 알아보도록 하지요!


반응형
by 발전소장 에르 :) 2017. 8. 2. 12:16
반응형


만약 매치되는 데이터타입이 없다면 다른 타입으로 프로모션되는 것을 타입프로모션 ( 업캐스팅) 이라고합니다.

위의 다이어그램을 보면 Byte는 Short, int, long, float , double로 업캐스팅이 가능하며,

short는 int, long, float, double로 업캐스팅이 가능합니다. char 타입은 int, long, float, double로 가능하네요.

외워두시면 요긴하실거같습니다.






반응형
by 발전소장 에르 :) 2017. 7. 27. 12:05
반응형

우리는 메소드 오버로드를 언제 사용할까요?

아마도 같은 메소드에 다양한 변수가 와야할 때에 사용해야할 겁니다.


6번줄에 오타가 있네요. 

여러모로 증진시켜준다.(o)


Adder란 클래스를 만들어 static 메소드를 만들었고

이름도 똑같고 타입도 똑같고 다른거라고는 파라미터와 리턴값뿐입니다.

사용자가 정수2개를 넣으면 1번 메소드가 실행될 것이고,

정수 3개를 넣으면 2번 메소드가 실행되겠네요.


예상하셨다시피 문제없이 잘 실행됩니다.

이번에는 매개변수의 타입을 다르게하여 메소드 오버로딩을 해보죠.

1번 메소드는 리턴타입이 int이고 

2번 메소드의 리턴타입은 double입니다.

 사용자가 정수를 입력할수도 혹은 실수를 입력할때에 대비해서겠죠?


1번 방법과 같이 예상하셨으리라 생각합니다.

자바는 어떤 면에서는 엄격하고 어떤 면에서는 유한 모습을 가지고 있는 언어입니다.

자바를 처음 다운받으셨을 때 보신 화면있죠?

30억명이 자바로 동작하는 디바이스를 가지고있는만큼

강력한 언어란 말이겠죠.


코드에 에러는 뜨지만 실행은 일단 되는군요.

그렇다면 결과값은 타입은 어떻게 될까요.?

int 이네요. 

Double타입 메소드와 순서를 바꾸니 타입이 double로 바뀌었습니다.

결론은 먼저 작성된 메소도를 컴파일러가 받아들이는군요.

메인 메소드를 10000000000개 오버로드 할 수 있습니다.

다만, String Array를 인수로 받은 것만 컴파일러가 호출합니다..

결론은 뻘짓. 이라고 생각했지만



결과값이 without 이네..? 뭔 일이지 싶어서 들여다보니

TestOverloding_4 클래스에 3개의 main메소드를 만들었고

3개의 메소드는 파라메터값만 다르게주니 

에러없이 3개다 건재하게 살아있네요.

위 논리는 자바8에서 변경된 점으로 보이네요.

다음엔 메소드 오버라이드편으로 찾아뵙겠습니다 :)

참고사이트 : https://www.javatpoint.com/method-overloading-in-java



반응형
by 발전소장 에르 :) 2017. 7. 25. 18:15
| 1 2 |