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

상속, 매개변수, 멤버변수, 반환타입의 다형성 본문

중앙 HTA (2106기) story/java story

상속, 매개변수, 멤버변수, 반환타입의 다형성

날아라쩡글이 2021. 9. 20. 12:18
반응형
  • 상속의 경우 물려받은 것 이상으로의 효과가 있다. 언제 사용을 할까?
  1. 상속의 첫번째 목적
    • 코드의 중복을 제거하였다. 
    • 하위클래스를 빠르게 개발할 수 있다. 
    • 클래스의 재사용성이 높아 졌다. 
    • 생산성 및 유지보수성이 높아졌다. 
  2. 상속의 두번째 목적 하위클래스에 비슷한 기능이 많을 때 
    • 상속과 메소드의 재정의는 하위클래스가 비슷한 기능을 가지고 있을 때 
    • 상위클래스로부터 재상속 받은 기능을 여러 하위클래스에서 재정의 했을 때 
    • 해당기능을 클래스에 상관없이 같은 방법으로 사용할 수 있게 되었을 때 (같은 이름을 사용하니까 )
    • 클래스 형변환을 적용하면 다향성을 발현 시킬 수 있을 때 

 

클래스란 

-정보를 저장하고, 정보를 전달하는 객체를 생성하기 위한 클래스가 존재한다.

Person, Student, Proffessor, Employee, Product, Book, Moive order, Account,Board

-업무로직을 수행하는 객체를 생성하기 위한 클래스가 존재한다.

  1.  PersonService - 사람등록기능, 사람조회기능, 사람검색기능, 사람정보수정기능
  2. ProductService - 최근상품조회기능, 신상품등록기능, 상품정보수정기능
  3. BookService - 베스트샐러조회기능, 카테고리별조회기능, 상세적요조회기능, 연관도서조회기능
  4. OrderService - 주문하기기능, 주문취소기능, 주문조회기능
  5. BoardService - 게시글조회기능, 게시글등록기능,게시물수정기능, 게시물삭제기능, 댓글삭제기능
  6. ~~~Service

- 사용자와 상호작용하는 객체를 생성하기 위한 클래스가 존재한다.  

  1. PersonControllerApp
  2. ProductControllerApp
  3. BookControllerApp
  4. OrderControllerApp
  5. Person[]database
  6. ~~~App

매개변수의 다형성 

매개변수로 어떤 객체가 올지 모르기 때문에 모든 객체의 공통기능을 가지고 있는 객체인 Person으로 두면, 클래스형변환으로 인하여, Student와Employee가 매개변수에 닿자마자 바로 클래스 형변환으로 안쪽방향 탐색후 Student, Employee의 내부의 super의 주소값을 주소에 대입한다. 

매개변수를 Object로 진행할 경우,print()를 재정의해서 사용을 하지 못하고, 다른 데이터를 추가할 경우그 데이터를 골라내지 못하고 전부 객체의 주소값을 첨부할 수 있다는 것이다. 재정의한 값이 출력이 가능하려면 그 재정의하길 원하는 속성이 들어가 있는 객체의 조상값을 입력을 해야한다는 것이다. 

Object의 객체에 Object를 넣으면 void Print(){} 속성값이 존재하지 않아서 출력되지않고 ((Person)Object).print();처럼 강제형변환을 작성해주어야한다. 아예 없는 것이라고 생각하면된다. 특정객체의 장점을 살릴 수가 없다. 객체끼리 연결하고, 관계를 맺으려면 추적이 되어야한다. 사용하려면 전부 연결해서 사용을 하고 객체로 사용하기 위해 파악을 해야한다. 

반환타입의 다형성

매개변수와 반환타입을 확인해야한다. 

반환타입이  Person(부모타입)이면, Person, Student, Professor,Employee타입의 객체를 반환할 수 있다는 것이다. Person타입을 전달할꺼니까 Person의 참조변수를 준비하라고 작성하는 것이다. 

return타입의 객체의 이름을 적고 메소드 위에서는 객체의 반환타입이 어떤게 올지 모르기 때문에 객체의 조상객체를 작성하였고, 클래스 형변환이 작성되었다. 그리고 메소드 재정의가 실행되어 부모객체의 메소드가 아닌 반환이 이뤄져야하는 객체의 메소드 재정의가 실행이 되었다. 

기본자료형변수의 타입의 경우 0이라는 값이 있기 때문에 int , boolean은 초기화를 하지 않아도 값이 들어가 있음을 알수 있다. 그러나 참조변수의 경우 주소가 들어가던지 아니면 주소가 아닌 값인 null이들어감으로 항상 if문을 작성할때는 nullPointException이 일어날꺼라는 생각을 작성하고 작성해주어야한다. 

public Person searchPerson(int no) {// 반환타입의 다형성이 적용되었다. 어떤 객체가 들어올지 몰라서 전체 객체의 부모타입으로 지정했다.
//Person 타입의 반환타입은 Student/professor/Employee객체를 모두 반환할 수 있다. 
Person foundPerson = null;
for(Person person : database) {
if(person != null) { //(person != null && person.getNo() == no)으로 대체가능 순서는 null확인이 우선이어야함
if(person.getNo() ==no) {
foundPerson = person;
break;
}
}
}

클래스 

  • Static메소드, Static변수를 제외하고  객체를 생성할 때 사용되는 설계도 이다.
  • 구성요소는 변수, 생성자, 메소드이다. 

객체 

  • 클래스의 구성요건들을 객체로 만들고 실제로 사용가능한 상태로 만드는 것을 의미한다. 
  • 클래스는 설계도를 이용해서 메모리의 힙영역에 생성된다. 
  • 객체는 고유한 주소값을 가지고 있다. 
  • 객체의 주소값을 (Reference)라고 한다. 
  • 객체의 참조값은 참조변수에 저장한다. 

참조변수 

  • 객체의 참조값을 저장하는 변수다. 
  • 참조변수의 타입은 객체 생성에 사용된 클래스가 타입이다. 
  • 클래스로 만들어진 객체기 때문에 객체 생성에 사용된 클래스이기 때문에 객체 생성에 사용된 클래스가 타입이다.

클래스타입

  • Person person = new Person();
    • Person은 참조변수의 타입이다. 
    • Person은 참조변수이다. 
  • 객체의 멤버변수, 멤버메소드의 사용은 항상 참조 변수를 통해서만 사용이 가능하다. 
    • PersonService service = new PersonService (); // 참조변수를 우선 생성하고
    • service.printAllPerson();   --->참조변수 dot 메소드로 사용을 한다. 
  • 참조변수의 값이 null이면, 참조변수는 객체를 참조하고 있는 상태가 아니다. 
    • null값을 가지고 있는 참조변수의 멤버변수와 멤버메소드를 사용하게 되면 nullpointerException의 오류가 발생한다. 

멤버변수 

  • 객체의 속성 (정보, 값, 데이터)를 저장하는 변수다. 값을 저장한다. ValueDate라고 불리기도 한다. 
  • 객체가 생성될 때 변수의 타입에 맞는 저장소가 생성이되고, 저장소에는 해당타입의 기본값이 저장되어 있다. 특히, 기본형의 경우에는 기본값이 저장되어 있고, 일반 객체의 경우 null이 입력이 되어있다. 
  • null이 입력이 되어있는 경우 , 객체의 경우 기본 값은 주소가 입력이 되어있던지, 입력되기전 아무것도 등록되어있지 않다는 의미로 null값이 입력이 되어있는 것이다. 사용하려는 객체의 참조 주소값이 입력이 되면 바로 그 객체의 주소값이 입력이 된다. 
  • 객체가 유지되는 동안 멤버변수에 저장된 값도 계속 유지된다.

멤버메소드

  • 객체의 고유한 기능을 담당한다. 
  • 멤버메소드는 객체내의 모든 멤버변수를 사용할 수 있고, 객체내의 다른 멤버메소드를 실행 할 수 있다. 
  • 멤버메소드의 중복정의가 가능하다. 
  • 생성자 메소드는 멤버메소드가 아니다. 

생성자 메소드 

  • 클래스의 이름과 같은 이름을 가진 메소드이다. 
  • 반환타입에 대한 정의가 없다 (void까지 존재하지 않는다. )
  • new연산자와 같이 사용된다. 그외의 용도로는 사용할 수 없다. 
  • new연산자 다음에 (__)으로 사용이 가능하다. 
  • new연산자로 생성자 메소드의 이름에 해당하는 클래스(같은 이름으로 작성하기 때문)로 객체를 생성한다
  • 객체가 생성되면 new연산자와 같이 사용된 생성자 메소드가 자동으로 실행된다. 
  • 생성자 메소드는 중복정의가 가능하다. 멤버메소드 또한 제공한다. 
  • 생성자 메소드가 중복정의 되어있다는 것은 객체 생성 후 다양한 방법으로 객체를 초기화 할 수 있다는 것다.
    • class Person{
    • person(String name, String tel, int age){
    • this.name = name;
    • this.tel = tel;
    • this.age = age;
    • }}  //이렇게 멤버변수를 이용하여 초기화를 할 수 있다. 

메소드 중복정의(method OverLoding)

  • 하나의 클래스안에서 같은 이름의 메소드를 여러개 정의하는 것을 의미한다. 
  • 중복정의하기 위해서는 매개변수의 갯수, 타입, 타입별 순서가 달라야한다. 
  • 접근제한자, 반환타입은 상관이 없다. 
  • 기능은 비슷한 데, 메소드를 실행할 때 필요한 값이 다르거나 값의 갯수가 다른 경우 중복정의 할 수 있다. 
  • 비슷한 기능은 같은이름으로 실행 할 수 있도록 한다. 

상속

  • 부모클래스의 속성과 기능을 물려받는 것이다. 
  • 부모클래스의 속성과 기능중에서 접근제한자가 Private인 것과 생성자는 자식클래스로 상속되지 않는다. 
  • 상속하는 이유 
    • 여러하위 클래스에 동일한 속성과 동일한 기능이 반복될 때 
    • 부모클래스의 속성과 기능을 물려받아서 빠르게 자식 클래스로 구현해야할 떄 
    • 여러관련있는 여러 클래스들을 같은 종유로 만들어야 할 때

메소드 재정의 

  • 부모로부터 물려받은 메소드를 자식클래스에서 다시 정의하는 것이다. 
  • 접근제한자, 반환타입, 메소드명, 매개변수의 타입 및 갯수가 전부 동일해야한다. 
  • 메소드를 재정의 하는 이유 
    • 부모로부터 물려받은 기능이 자식 클래스에서 사용하기 적합하지 않을 때 
    • 부모클래스와 같은 사용법으로 기능을 구현해야할 때 
    • Person. print(); Student.print(); 동일한 사용방법으로 이용하고 싶다. 

클래스 형변환

  • 자식타입의 객체를 클래스 타입의 참조변수가 참조하는 것이다. 
  • 자식클래스 타입의 참조변수는 절대 부모클래스타입의 객체를 참조할 수 없다. 
  • 자동 클래스 형변환은 언제나 참조변수와 일치하는 타입의 객체를 생성된 객체에서 검색해서 참조하고 있는 것이다. (super로 조상타입의 객체의 주소값을 참조하고 있는것이다.)
  • Object타입의 참조 변수는 모든 객체를 참조할 수 있다. 
  • 클래스 형변환이 발생하면 부모타입의 참조변수에 저장된 값은 자식클래스타입의 참조값이 아니라 참조변수의 타입과 일치하는 객체의 주소값이다. 
    • Phone p = new Iphone(); 
    • 참조변수 p에 저장된 참조값은 Iphone객체의 참조값이 아니라, Iphone 객체 생성시 같이 생성된 Iphone객체의 참조값이다. 
    • 참조변수 p는 Phone객체의 공개된 속성과 기능을 사용할 수 있다.
    • 참조변수 P는 Iphone객체의 속성과 기능을 사용할 수 없다.
    • Iphone객체와 Phone객체의 메소드 재정의 단계에 있는 메소드가 있으면 Iphone객체의 메소드가 실행된다. 없으면 실행되지 않는다. 

다형성

  • 오버로딩 : 메소드 중복정의의 다형성
    • 하나의 객체안에 메소드가 매개변수 타입과 개수가 다르게 메소드가 중복정의 되어 있으면 적절한 메소드가 자동으로 선택되어 실행됩니다. 
  • 오버라이딩 : 메소드 재정의의 다형성
    • 부모클래스 타입의 참조변수가 자식클래스 타입의 객체를 참조하고 있고, 부모클래스와 자식클래스에 메소드 재정의 관계에 있는 메소드가 있을 때 부모클래스 타입의 참조변수로 재정의 관계에 있는 메소드를 실행하면 실행 생성된 자식 객체의 재정의된 메소드가 실행된다. 
    • 즉, 실행방법은 동일한 방법으로 계속 실행되는데, 참조하는 자식객체가 달라지면 실행결과가 다르게 발행되는 것이다. 

OOP

  • 전부 모든 객체지향언어프로그래밍에서 가지고 있는 공통속성과 기능이다. 
  • 구체화가 가능해야 연결이 가능할 수 있다.
반응형

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

추상클래스  (0) 2021.09.26
추상화  (0) 2021.09.24
클래스의 형변환  (0) 2021.09.17
메소드 재정의 (Overriding)  (0) 2021.09.16
상속  (0) 2021.09.14
Comments