Jump to Java 5장 객체 지향 프로그래밍

whco·2021년 8월 8일
0

Jump to Java

목록 보기
1/4

2021.08.08
간단하게 몰랐던 부분만 적을 예정.
Jump to Java 5장 참고

5장 객체지향 프로그래밍

  • 특징 :

    • 코드 재사용성 높음.
    • 코드 관리 쉬워짐.
      • 코드 간의 관계를 맺어줌으로써 보다 적은 노력으로 코드변경 가능.
    • 신뢰성 높은 프로그램 개발 가능.
      • 제어자와 메소드를 이용해 데이터를 보호하고, 코드의 중복을 제거하여 코드간의 불일치로 인한 오류 방지
  • 클래스

    Animal cat = new Animal();
    • 객체 변수(Instance variable), 멤버 변수, 속성
  • 메소드

    public void setName(String name) {
        this.name = name;
    }
    • 객체 변수의 값은 공유되지 않지만 static을 이용하게 되면 객체 변수를 공유하도록 만들 수도 있다.
  • Call by value

    • 메소드에 값(primitive type)을 전달하는 것과 객체(reference type)를 전달하는 것에는 큰 차이.
    • 메소드로 객체를 전달할 경우 메소드에서 객체의 객체변수(속성) 값을 변경할 수 있게 된다.
    • 값을 전달하는 경우 원본은 그대로 두고 복사해서 사용하는 듯.
  • 상속(Inheritance)

    public class Dog extends Animal {
    
    }
    • IS-A 관계에선 자식 객체는 부모 클래스의 자료형인 것처럼 사용할 수 있다.
      Animal dog = new Dog();//가능
      Dog dog = new Animal();  // 컴파일 오류: 부모 클래스로 만든 객체는 자식 클래스의 자료형으로 사용할 수 없다.
    • 자바에서 만드는 모든 클래스는 Object라는 클래스를 상속
    • 자바는 다중 상속을 지원하지 않는다. : 같은 형식의 메소드 중 무엇을 먼저 실행해야 할 지 불명확하기 때문.
  • 생성자(Constructor)

    • 메소드명이 클래스명과 동일하고 리턴 자료형이 없는 메소드
      • 클래스명과 메소드명이 동일하다.
      • 리턴타입을 정의하지 않는다.
    • 객체 변수에 값을 무조건 설정해야만 객체가 생성될 수 있도록 강제할 수 있는 방법
    public HouseDog(String name) {
        this.setName(name);
    } 
    
    HouseDog dog = new HouseDog("happy");   // 생성자 호출 시 문자열을 전달해야 한다.
    HouseDog dog = new HouseDog();//컴파일 에러
    • 생성자가 선언된 경우 생성자의 규칙대로만 객체를 생성할 수 있다.
    • defalut 생성자
      public Dog() {
      }
      • 만약 클래스에 생성자가 하나도 없다면 컴파일러는 자동으로 위와같은 디폴트 생성자를 추가
    • 생성자 오버로딩 가능
  • 인터페이스

    • 일종의 추상클래스. 추상클래스보다 추상화 정도가 높다.

    • 추상메소드와 상수만 멤버 가능.

    • 인스턴스 생성 불가, 클래스 작성에 도움을 줄 목적으로 사용.

    • 미리 정해진 규칙에 맞게 구현하도록 표준 제시하는 데 사용

      //Predator.java
      public interface Predator {
          public String getFood();
      }
      
      //Tiger.java
      public class Tiger extends Animal implements Predator {
          public String getFood() {
              return "apple";
          }
      }
      //Lion.java
      public class Lion extends Animal implements Predator {
          public String getFood() {
              return "banana";
          }
      }
      
      //변경 전
      public void feed(Tiger tiger) {
      System.out.println("feed apple");
      }
      
      public void feed(Lion lion) {
      System.out.println("feed banana");
      }
      
      //변경 후
      public void feed(Predator predator) {
      System.out.println("feed " + predator.getFood());
      }
      
    • tiger, lion은 각각 Tiger, Lion의 객체이기도 하지만 Predator 인터페이스의 객체이기도 하기 때문에 위와같이 Predator를 자료형의 타입으로 사용할 수 있다.

    • 객체가 한 개 이상의 자료형 타입을 갖게되는 특성을 다형성(폴리모피즘)

    • 중요 클래스를 작성하는 입장이라면(여기서라면 ZooKeeper가 중요한 클래스가 될 것이다) 클래스의 구현체와 상관없이 인터페이스를 기준으로 중요 클래스를 작성해야만 한다. 구현체(Tiger, Lion, Crocodile,...)는 늘어가지만 인터페이스(Predator)는 하나이기 때문

    • 중요한 점은 메소드의 갯수가 줄어들었다는 점이 아니라 ZooKeeper클래스가 동물들의 종류에 의존적인 클래스에서 동물들의 종류와 상관없는 독립적인 클래스가 되었다는 점이다. 바로 이 점이 인터페이스의 핵심

  • 다형성(Polymorphism)

    • 하나의 객체가 여러개의 자료형 타입을 가질 수 있는 것

      //Tiger.java
      public class Tiger extends Animal implements Predator, Barkable {
        public String getFood() {
            return "apple";
        }
      
        public void bark() {
            System.out.println("어흥");
        }
      }
      
      Tiger tiger = new Tiger();
      Animal animal = new Tiger();
      Predator predator = new Tiger();
      Barkable barkable = new Tiger();
    • 인터페이스는 일반 클래스와는 달리 extends 를 이용하여 여러개의 인터페이스(Predator, Barkable)를 동시에 상속할 수 있다. 즉, 다중 상속이 지원된다. (※ 일반 클래스는 단일상속만 가능하다.)

      의문 : 같은 형식의 메소드 우선순위 문제는 인터페이스에서는 해결했나??
  • 추상클래스

    • 클래스가 설계도라면 추상클래스는 미완성 설계도

    • 추상메소드를 포함하고 있는 클래스

      • 추상메소드 : 선언부만 있고 구현부는 없는 메소드
    • 생성자는 있어야 한다.

    • 다른 클래스를 작성하는 데 도움을 줄 목적으로 작성

    • 인스턴스 생성 불가.

    • 일반메소드가 추상메소드 호출 가능.

      //Predator.java
      
      public abstract class Predator extends Animal {
        public abstract String getFood();
      }
      
      //Tiger.java
      
      public class Tiger extends Predator implements Barkable {
        public String getFood() {
            return "apple";
        }
      
        public void bark() {
            System.out.println("어흥");
        }
      }
      
    • 추상클래스를 만들기 위해서는 class 앞에 abstract 라고 표기

    • 또한 인터페이스의 메소드와 같은 역할을 하는 메소드(여기서는 getFood 메소드)에도 역시 abstract 를 붙이도록 한다.

    • Tiger클래스는 이제 Predator 인터페이스를 implements 하던 것에서 Predator 추상클래스를 extends 하도록 변경되었다.

    • 추상클래스에 abstract 로 선언된 메소드(getFood 메소드)는 인터페이스의 메소드와 마찬가지로 추상클래스를 상속하는 클래스에서 반드시 구현해야만 하는 메소드

    • 추상 클래스에는 abstract 메소드 뿐만 아니라 실제 메소드도 추가가 가능

0개의 댓글