■ 서론


다형성을 구현의 다양함 정도로 설명했고 그 예시로 오버라이딩, 오버로딩을 들었다.

다형성에 대해 좀 더 알아보고자 이렇게 정리한다.



■ 바인딩


보통은 참조변수의 타입과 객체의 타입이 일치하지만,  변수의 타입과 객체의 타입이 다른경우를 볼 수 있다.

예를들면 Map mapping = new HashMap(); 이 있다.


어떤 시점에서, 메소드가 호출될 때 어떤 코드를 수행할 것인지가 결정된다.

이러한 결정을 메소드 호출을 메소드 정의에 바인딩(binding)한다고 한다.


많은 경우에, 메소드 정의에 대한 메소드 호출의 바인딩이 컴파일 시간에 일어날 수 있다. 

그러나 다형 참조의 경우에는 실행 시간까지 바인딩을 할 수 없다.



 정적바인딩(static binding / early binding)

 동적바인딩(dynamic binding / late binding)

 private, final, static 이 이에 해당한다.


컴파일러에 의해 컴파일시간에 결정된다.

컴파일러는 객체의 타입을 알 수 없으므로,

Dog타입으로 먼저 컴파일을 진행한 후, 

실행 중 Pudle타입의 메소드가 호출된다.


런타임 중(실행시간)에 결정된다.


   class Dog {

      void sound(){

         System.out.println("멍멍~~");

      }

   }


   public static void main(String[] args) {

      Dog d = new Dog();

      d.sound();

   }

   class Pudle extends Dog { 

      void sound(){

         System.out.println("푸들~~");

      }

   }


   public class Test {

      Dog d = new Pudle();

      d.sound();

   }

 컴파일 시간에 많은 정보가 결정되므로 실행 효율이 높다.

런타임 중에 자유롭게 결정되므로 유연하다. 




■ 상속에 의한 다형성


Animal creature = new Horse(); 라고 선언하면, 변수 creature는 Animal의 어떤 객체라도 참조할 수 있다.

또한 Animal을 상속받는 어느 클래스의 객체 Horse(예시)도 참조할 수 있다.


클래스의 계층구조의 최상단에는 Object가 있는데, Object는 모든 클래스의 객체를 가르킬 수 있다는 말이된다.


Animal을 상속받은 Horse, Hippo 클래스가 있다고 하자.


Animal creature;


creature = new Horse();

creature.move(); ㅡ 1번


creature = new Hippo();

creature.move(); ㅡ 2번


이때, creature의 타입은 Animal이지만,

1번에서는 Horse의 move()가, 2번에서는 Hippo의 move()가 실행된다.


이렇게 상속에 따른 다형의 객체를 참조할 수 있으며, 

메소드 호출 또한 실행 당시의 참조 객체의 메소드를 선택하여 호출하는 것을 상속에 의한 다형성이라고 한다.




■ 인터페이스에 의한 다형성


인터페이스 역시 클래스와 마찬가지로 변수 타입으로 사용될 수 있다.


  public interface Speaker{

    
      public void speak();
      public void announce(String str);

   }

   Speaker current;

     public class Philosopher implements Speaker{

    
         public void speak(){

           System.out.println("Hello");

       }
         public void announce(String str){

           System.out.println(str);

       }

         public void Listen(){

           System.out.println("I got it");

       }


     }


라는 인터페이스와, 참조변수 current를 가정해보자.

참조변수 current는 Speaker 인터페이스를 구현하는 어떤 클래스의 객체라도 참조할 수 있다.


Philosopher 클래스가 Speaker를 implements 한다면

current = new Pilosopher(); 라고 바인딩 할 수 있다.


여기서 주의할 점은,


인터페이스 참조 변수를 사용하고 있을 때, 그 참조 변수가 가리키고 있는 객체가 

인터페이스에 없는 다른 메소드를  포함하고 있다고 할지라도, 그 인터페이스에 정의되어 있는 메소드만을 호출할 수 있다.


current는 Philosopher 타입의 객체를 바인딩 했지만 Speaker 타입이기 때문에, 

Listen()은 사용할 수 없고, Speaker 인터페이스가 가진 speak(), announce() 메소드를 사용할 수 있다.


특별한 상황에서 Listen() 메소드를 호출이 필요할 경우, 캐스팅을 사용해서 할 수도 있다.

Speaker special = new Philosopher();

((Philosopher)special).Listen();




■ 추천 사이트


예시가 아주 잘 나와있다.


https://opentutorials.org/module/516/6127




■ 출처


http://secretroute.tistory.com/entry/140819

http://blog.daum.net/_blog/BlogTypeView.do?blogid=0LoOX&articleno=6036856&_bloghome_menu=recenttext

http://hyeonstorage.tistory.com/266



'코딩 > Java 프로그래밍' 카테고리의 다른 글

OOP 용어 정리  (0) 2016.12.14
자바 Collections 클래스 Comparator  (0) 2016.11.26
[JAVA] Scanner nextInt()나 next() 사용 후 nextLine 입력  (0) 2016.11.26
자바의 4대 특성  (2) 2016.10.17

■ OSI 7 계층이란


 ISO에서 서로 다른 시스템 간의 통신을 허용하기 위해 OSI 참조모델을 만듬

● OSI 참조모델은 호환성이 있는 네트워크 프로토콜의 개발을 위한 지침 제공

● OSI 참조모델은 네트워크가 제공하는 여러가지 기능을 7개의 계층으로 나누어 식별

● 각 계층은 독특한 기능을 가지며, 전체 모델이 올바르게 작동할 수 있도록 계층 간에 상호 의존





■ 물리 계층


 역할

 ● 시스템간의 물리적인 연결, 혹은 전기 신호의 복원 서비스를 제공한다.

     (데이터 ㅡ> 전자신호로, 전자신호를 ㅡ> 데이터로 변환)

 통신단위

 Bit

 장비

 리피터(물리적 신호를 증폭하여 신호가 감쇠되는것을 방지), 허브




■ 데이터링크 계층


 역할 

 ● 물리적으로 연결되어 있는 호스트끼리 통신을 담당한다.

    (MAC 주소를 연결, 물리적 장치들간의 연결을 담당 ㅡ> 물리회선을 통신채널로 변화)

 ● 흐름제어 : 보내는 측과 받는 측 사이의 속도차를 제어한다.

 ● 에러제어 : 전송오류를 검출하고 수정한다.

 ● 순서제어 : 패킷이나 ACK 신호를 혼동하는 것을 피하기 위해, Sequence Number를 부여.

 통신단위 

 Frame

 프로토콜

 MAC(이더넷, 토큰링), PPP

 주소체계

 MAC

 장비

 스위치,  브릿지(두개의 LAN을 연결해주는 통신망 연결 장치)




■ 네트워크 계층


역할

 ● 헤더에  논리적 주소를 추가

 ● 경로제어(라우팅) : 송신에서부터 수신까지의 패킷의 경로를 제어한다.

통신단위 

 Packet

프로토콜 

 IP(V4/V6), ARP(브로드캐스트 방식으로 IP를 이용하여 MAC주소를 알아냄), RARP(ARP의 반대)

주소체계 

 IP

장비 

 라우터  (LAN:LAN 또는 LAN:WAN을 연결하는 네트워킹 장치)


※ ARP 프로토콜의 사용 예


A컴퓨터가 192.168.0.123 주소로 패킷을 보내려고 할 때, IP주소(논리적:변경가능)는 알고 있지만 MAC주소(물리적:고유)는 모르는 상태다.

그럼 A는 브로드캐스팅(ARP프로토콜)을 통해 192.1368.0.123 누가쓰냐? 라고 물어본다.

B는 어 그거 내가 쓰는데? 라고 응답하게 됩니다. B이외에 C,D...등등은 해당되지 않기 때문에 응답을 하지 않는다.

그럼 A는 B에게 MAC주소좀 알려줘 하게 되고, B의 MAC주소를 받게되고 패킷을 보낼 수 있다.

그 후에는 A는 B의 MAC주소를 ARP 테이블에 추가했기 때문에 (IP와 MAC을 mapping 시켜놓은 table), 패킷을 바로 보낼 수 있다.




■ 전송 계층


역할

 ● 헤더에 포트번호를 추가

 ● 어떤 종류의 네트워크가 사용되었는지를 사용자가 의식하지 않도록 논리적 통신을 지원.

 ● 프로세스와 프로세스(종단간, End-To-End)의 통신을 담당한다.

 ● 데이터가 중복, 유실된 것을 발신자에게 재전송을 요구해 신뢰적인 전송을 보장한다.

통신단위 

 Segment

프로토콜 

 TCP, UDP

주소체계 

 Port

장비 

 게이트웨이




■ 세션 계층


 역할

 ● 응용 프로그램간의 연결과 ,유지와, 연결을 끊는 역할을 담당한다.

 통신단위

 Data




■ 표현 계층


 역할

 ● 서로 다른 데이터 표현방식을 하나의 통일된 형식으로 변환하는 역할

 ● 암호화(Encryption), 압축(Compression), 코드변환(ASCII, Binary, BCDIC)

 통신단위

 Data

 프로토콜

 JPG, MPEG




■ 응용 계층


 역할

 ● 사용자 계층을 말하며, 사용자 인터페이스를 제공한다.

 통신단위

 Data

 프로토콜

 DHCP(동적할당), DNS(도메인), FTP(파일전송), HTTP(웹), POP3(이메일), RIP,

 SMTP(이메일), SSH(원격), TELNET(원격), XMPP




■ 출처


http://mintnlatte.tistory.com

https://ko.wikipedia.org/

http://hahahoho5915.tistory.com/12

함수의 호출 방법에는 Call by value (값에 의한 호출) Call by reference (참조에 의한 호출) 

두 가지의 방식이 있다



우선 Call by value의 이해를 돕기 위한 간단한 그림을 준비했다.



Call by reference (참조에 의한 호출)






 

Call by value (값에 의한 호출)






■ 출처


http://luckyyowu.tistory.com/9


+ Recent posts