날아라쩡글이의 블로그입니다.

메소드 재정의 (Overriding) 본문

중앙 HTA (2106기) story/java story

메소드 재정의 (Overriding)

날아라쩡글이 2021. 9. 16. 05:43
반응형
  • 상위클래스로부터 상속받은 메소드의 내용을 재정의 하는 것이다. 
  • 상속관계에 있는 상위 클래스로부터 상속받은 메소드를 하위클래스에서 그대로 사용하지 않고, 하위클래스에 맞게 내용을 변경하는 것이다.(메소드의 내용을 재정의하는 것)

이클립스 무료 플로그인 설치 방법 -> 1. 마켓플레이스에서 다운받는다.-> popular에서 오픈 소스코드를 얻을 수 있다. Spring, web개발, sonarLint6.1이라는 소스코드에 대한 품질 검사를 하는 것 2.help의 install을 이용하여 다운받는다. 2번을 이용하여 Amateras Modeler 사이트를 입력하여 다운받는다. 

Amateras ERD, Amateras UML을 확인 할 수 있다. ERD의 경우 entity relation Diagram의 뜻으로 DV의 데이터를 지칭하는 다이어그램에 대한 툴이다. UML의 경우 분석 설계완료시 어떤 클래스들의 필요관계에 대해서 사용자는 어떤걸 사용할껀지, 관리자는 어떤걸 사용할 껀지, 중간관리자는 어떤걸 사용할 껀지에 대한 모델링하는 도구를 통합한 것이다. 유스케이스, 시퀀스, 클래스 다이어그램이 있어서, 분석 설계 기획(프로젝트 개발단계)가 완료되고 산출물들을 개발자에게 전달하는데, 그것에 대한 산출물을  Actor별로 사용기능을 보여주는 것이다. 

부모로써 물려받은 메소드가 옛날 형식으로 구닥다리 같을 때 override로 재정의를 한다. 

  • Ctrl + space를 누르면 Override method in 'object', Override method in 'Phone'이라고 나온다. 나에게 맞게 재정의를 할 수 있다는 뜻이다. 
  • Override method in 'Phone'을 누르게 되면 @Override라는 것이 생긴다. 

  • @Override로 들어가게 되면 @Retention(Retentionpolicy.Source)라는 게 나와있다. Source라는 뜻은 컴파일하고나서 멈춘다는 의미이고, Runtime이라는 것은 컴파일 이후에도 끝까지 남아있는다는 뜻이다. 
  • @Override로 다시 돌아가서 Override는 내맘대로 정의를 할 수 없다. 메소드의 형태는 그대로 작성을 해야하고 내용물만 변경 할 수 있다. 접근제한자/ 반환타입/ 메서드이름/ (매개변수 )이름{내용물만 변경이 가능하다} @을 작성함으로써 부모에 대한 메소드들이 그대로 잘 사용하는지 확인 할수 있다. 
  • @Override라고 하는 것은 어노테이션이라고 부른다. 클래스, 각 구성요소(변수, 생성자, 메소드)에 부착할 수 있다. 각각의 어노테이션은 그 어노테이션이 어느 시점까지 남아있는지를 지정할 수 있다. 각각의 어노테이션은 IDE, 컴파일러, 프로그램, 라이브러리, 프레임워크 등에게 부가적인 정보를 제공할 목적으로 사용된다. 상위에서 물려받은 메소드를 재정의하는 메소드라는 걸 의미하는 어노테이션이다.
  • 메소드를 다르게 작성하면 안되고 부모와 완전히 똑같아야한다. 
  • 위에서 프린트의 기능을 컬러와 사진 프린트를 사용하고 싶고, 메소드를 재정의 하고 싶지 않다면 프린트를 하나 더 구매해서 사용하면 되는 것이다. 이 것은 객체지향원칙중 단일 책임의 원칙으로 두 가지 일을 싫어하는 객체 지향 주의의 성격때문이다. 

객체지향의 5가지의 원칙(SOLID) 정처기 시험을 준비할 때 나오는 원칙이다. 

  1. SRD : 단일 책임의 원칙 , 다중으로 책임을 갖지 않고 한가지 책임만을 갖는 다는 원칙이다. 메소드 재정의가 싫다면 프린트 흑백기능의 메소드를 갖고싶으면 흑색기능의 프린터기를 사용하면 되고, 컬러프린터기를 갖고싶다면 컬러기능의 프린터기를 사용하면 된다는 것이다. 금액이 많이 드는건 사용자의 입장에서이고, 만드는 입장에서와 사용하는 입장에서는 복잡해지기 때문에 , 쉽게 바꿀 수 있어야 한다는 이야기이다.
  2. OCP : 개방 폐쇄의 원칙
  3. LSP : 리스코프치환의 원칙
  4. ISP : 인터페이스 분리 원칙
  5. DIP : 의존관계 역전 원칙
  • 단일 책임의 원칙에 대해서 좀 더 이야기를 해보자면 트랙은 경주용 차로 이용하고, 일반도로는 차로 이용하는 것을 생각해보면 된다. 차가 2대를 가지고 있으면 경주용 차를 이용할 수 있고, 일반도로도 이용할 수 있다. 이건 만드는 입장에서도 사용하는 입장에서도 좋은 것이다. 도로, 산악, 경주도로에서도 이용하는 기능을 전체적으로 합치게 되면 산악용에서는 뭐가 제거되고 경주도로에서도 뭐가 제거되서 사용되야하고 일반도로에서는 어떤 기능을 더 합쳐서 달려야하는 등 번거로움이 생긴다. 메소드 사용에서는 복잡하면 안된다. 쉽게 바꿀 수 있어야하는것. 그게 단일책임의 원칙이다. 
  • 이것은 Phone의 특성의 경우 화면을 키는 기능 기능와 끄는 기능을 가지고 있고, 그 기능을 Override를 하여 얼굴인식을 하면 화면이 켜지는 메소드로 재정의 한 것을 나타낸다. 버튼을 눌러서 화면을 키고 싶다면 그냥 phone을 구매하면되고 얼굴인식을 하고 싶으면 아이폰을 구매하면 된다는 것이다. 
  • 메소드 재정의시 : 실현부분에 대해서만 내가 제정의 할 수 있기 때문에 내가 생성한 게 무엇이냐에 따라서 동작이 다르다. 
  • 메소드 name의 이름은 동일하다. phone을 사용하면 끄는 기능, 키는 기능이 존재하기 때문에 Iphone에서도 끄고, 키는 기능이 필요하기 때문에 사용이 가능하다. 객체가 달라도 사용방법이 같지만 발현은 다르다는 것이다 (버튼 or얼굴인식) 재정의를 하면 전부 사용은 on으로 변경하고, 부모의 메소드를 재정의하여, 부모의 습득이름은 동일하게, 객체가 바뀌어도 일관성 있게 사용할 수 있다는 것 이다. 
  • 재정의에는 제하닝 없다. 부모와 안맞다, 방식이 구닥다리다?? 그러면 전부 재정의 해주면된다. @Override라는 어노테이션을 해준다면(없어도 된다. 필수는 아니다) 1. 어떤걸 Override했는지 파악이 가능하다. 2. 메소드 이름을 자동으로 불러오는 것이기 때문에 잘 못 적을 수 있다는 것이다. 그럼 틀렸을 때 @Override에 빨간줄이 간다.
  • 위에 사진과 같이 키는 기능은 On으로 설정되어 있다. 끄는 기능도 off으로 되어있는데, 객체의 존재가 달라져도 일관성 있는 사용방법으로 사용법이 동일하다는 것이다.
  • 목적에 맞는 객체를 만들어서 사용하는것은 객체마다 사용법이 다르면 힘들다는 것이다. 상속받은 메소드가 사용방법은 동일하지만 사용 발현은 다르게 재정의 하는 것은 중요하다. 
  • Override를 하는 그림이다. 똑같은 메소드를 이용하지만 수행문만 다르다는 것을 알 수 있다. 
  • 자바에서 저장하는 방법이 여러가지인데 똑같이 collection<e> {boolean add(E a )  }으로 재정의해서 구현해낸다. 

이렇게 많은 자식들이 구현되있는데 사용방법은 전부동일하다.메소드를 Override를 했기 때문이다. 사용하기 훨씬 필요했다. 부모의 메소드 중복정의도 많이 사용하지만 재정의 또한 빈번하게 이용 되고 있기 때문에 구분이 필요하다. 

  메소드 중복 정의 메소드 재정의
구분 같은 클래스이다.  상-하위클래스이다.
조건 메소드이름은 동일하다. 
매개변수 갯수/ 타입을 다르게 정의
반환타입은 상관없다. 
접근제한자의 제한이 없다

메소드 이름 동일하다. 
매개변수의 갯수와 타입은 동일하다.
반환타입은 동일하다. 
접근제한자는 동일하거나 더 느슨하게 
(개방적으로)

사용목적

매개변수만 다르고, 구현내용이 비슷할 때 부모로부터 상속받은
메소드가 자신과 맞지않을 때
이로운 점 비슷한 기능을 같은클래스 안에서 일관된 이름으로 사용한다.  다른 클래스. 상-하위 클래스의 객체는달라도 사용법이 동일해 진다. 

 

this, this() , super super()

  • this : 객체 자기자신의 주소값을 가지고 있다.
  • this() : 객체가 가지고 있는 생성자 메소드
  • super : 자신의 상위 객체에 대한 주소값을 가지고 있다. 
  • super() : 자신의 상위 객체가 가지고 있는 생성자 메소드 
  • this()는 이 설계도로 생성된 객체의 기본생성자 메소드이다. 다른 값을 받으면 다른 값이 들어가는 생성자로 만들어주어야한다. 
  • super()는 상위 클래스의 메소드를 재정의 한 곳에서 상위클래스에 정의된 똑같은 이름의 메소드를 호출해야할 때 사용된다. super()메소드는 따로 추가하지 않는다면 자동으로 추가가된다. 생성자 메소드의 첫번째 수행문으로 항상 생성자의 첫줄에 존재한다. 부모부터 먼저 초기화가 진행되어야 하기 때문이다. super(int int int)를 작성한다며 super(); 는추가가 되지 않는다. 부모 생성자가 기본생성자가 없을 경우에는 하위 생성자도 기본형을 작성할 수 없다. 그렇기 때문에 생성자 메소드는 주의해서 작성해주어야한다. 
  • 생성자가 아닌 곳에서 호출하는 것은 1. 객체 생성할 때 new연산자와 함께 사용하기 2. 생성자 메소드 안에서 다른 생성자 메소드를 호출할 때가 있다. 
  • 위의 그림판으로 그린것을 보면 super을 통하여 상위객체의 주소값을 호출하고, this를 통하여 자신의 주소값을 호출하는 것을 알 수 있다. 
  • 원래 생성자 메소드 안에는 super();이 자동적으로 생성이 되있고, 생략이 되어있다. 따로 적지 않으면 모든 생성자 메소드에는 상위호출 메소드가 들어가 있다. 모든 하위 클래스의 생성자에는 부모의 기본생성자 메소드를 호출하는 super();이 자동적으로 추가가 되어있다. 단, super()이외 다른 super(값, 값...)를 추가하면 super()이 자동으로 추가되지 않는다. 상위클래스에서 기본생성자가 없으면 super(int, int) , super(int, int, int )의 값을 입력하고, 하위 클래스에서도 거기에 맞게 정의되어야한다. (기본생성자가 상위클래스에 입력X 하위클래스에서도 입력 X) 만약 하위클래스에서 기본생성자를 사용하고 싶자면, 상위 생성자에서 추가를 하던지, 사용하지 말던지 해야한다. 
  • no, pricer,discountPrice/ no, price, price는 상위클래스에 적힌 모습 그대로이다. 
  • 동일하게 상위객체의 this에서 적힌 것처럼 똑같이 super에서도 작성을 해주어야한다. 

객체의 필드 

  • 속성, 매개변수, 인스턴스 변수, 필드, 프로퍼티 == >전부 동일한 것을 말한다. 상황에 따라서 가르키는 단어가 많다. 
  • 속성의 경우 값을 가지고 있다는 뜻이다. 
  • 맴버변수의 경우 맴버로써 참여를 하고있다는 것이다. 
  • 인스턴스 변수의 경우 객체로 만들어져서 *인스턴스라고 부른다. 인스턴스화~
  • 프로퍼티는 고유한 성질을 의미한다. 전부 같은 것을 의미한다 
  • 내가 동생에게는 언니 오빠에게는 동생 ,친구들에게는 여러가지 별명으로 불리는 것처럼 똑같이 다 같은 것을 의미하는 것이다. 

this()- 같은 객체안의 생성자를 실행하는 것이다. 1. 참조변수의 this가 있고, 1. 같은 객체안의 생성자 this()가 있는 것이다. 

super() 상위 객체 안의 생성자를 실행하는 것이다. 1. 상속받은 참조변수 super이 있고, 2.부모 객체를 상속받을 수 있는 객체내의 생성자 super()이 있는 것이다. 부모 메소드를 재정의 하고, 그 메소드를 사용할 때 그때 super()을 사용한다. 

 

자바의 기본 형 변환

  • 정수 -> 실수 :double x = 10; x에는 10.0이 저장된다. 
  • 실수  ->정수 :int x = (int)3.14;형변환 연산자가 실수 3.14를 정수 3으로 형변환하고 x에 대입한다. 
  • 정수 -> 정수 : int x = 10; byte y = (byte)x; 4byte크기의 정수 10을 1byte크기의 변수 y에 대입하기 위해서 byte로 형변환한다. 잘쓰지는 않는다.  
  • 실수 -> 실수 :double x = 3.1; float y =(float) x; 8byte 크기의 실수 3.1을 4byte 크기의 변수y에 대입하기 위해서 float로 형변환 한다. 
  • 문자 -> 정수: int x = ' A ' 문자 'A'의 아스키코드 값 65가 정수 x에 대입된다.
  • 정수 -> 문자: char x = 65; 아스키코드 65에 해당하는 문자 'A'가 x에 대입된다.
  • 나머지는 헛소리이다. 
  • 정수 -> 문자 열 : String x = String.value.f(34);
  • 문자열 -> 정수 : int x = Integer.parseInt("34");
  • 문자열 -> 실수 double x - Double.parseDouble("3.14"); --->형변환이 아니다. 각각 String , Integet, Double클래스의 정적메소드를 이용해서 값을 변환한 것이다. 

클래스의형변환 

상속관계, 구현관계에 있는 상위 객체와 하위 객체 사이에서만 발생하는 것이다. 

객체 형변환 과정설명

  1. Iphone의 객체가 생성됨.
  2. Iphone의 객체의 주소값 0x345는 phone타입의 참조변수인 iphone2에 대입할 수 없음
  3. 지금 생성된Iphone객체의 안쪽에 Phone객체가 있는지 탐색함. 
  4. Phone객체가 발견됨
  5. 발견된 phone 객체의 조수값 0x 123이 iphone3에 대입됨. 
  6. iphone3은 Iphone내부의 Phone객체를 참조함

하위타입의 객체를 상위타입의 참조 변수가 참조하게 할수 있다. 자식으로 바꾸고 싶다면 밖에 형변환을 적어서 바깥쪽으로 참조하게 만들 수 있다. 

같은 종류로 만드는 것은 

  • 변수를 만들어서 아이폰만 담게 하고 싶음
  • 배열을 만들어서 스마트폰 종류만 담고 싶음 
  • 제한을 두어서 원하는 값을 추출할 수 있다. 

상속 :

  • 1. 중복코드를 제거하기 위해서, 
  • 2. 같은 종류가 되게 하려고, 부모랑 같은 종류가 된다. 같은 종류에서만 형변환이 가능하기 때문이다. 
  • 몇단계안쪽에 있던지 내부를 확인하여 조상이 있으면 확인 할 수 있다. 
  • Object의 경우 모든 객체의 최상위의 조상이다. 
  • 상속에 대해서 같은 종류, 같은 종류의 클래스로 만들고 싶을 때, 형변환을 하고 싶을 때에는 Object를 담아서 모든값으로 만들 수 있다. Object는 항상 최상위의 객체이기 때문이다. 
  • 부모와 자식관계는 상-하위 관계로 옮겨다닐 수 있다. 
  • 이것과 메소드 재정의를 한다면 훌륭한 객체가 완성된다. 
반응형

'중앙 HTA (2106기) story > java story' 카테고리의 다른 글

상속, 매개변수, 멤버변수, 반환타입의 다형성  (0) 2021.09.20
클래스의 형변환  (0) 2021.09.17
상속  (0) 2021.09.14
접근제한자 (modifier)  (0) 2021.09.13
Static , 정적메소드, 정적변수  (0) 2021.09.12
Comments