[JAVA] 객체 지향 프로그래밍 2

타키탸키·2022년 9월 4일
0

JAVA

목록 보기
8/8
  • 상태
    • 멤버 변수의 값으로 정의
  • 행동
    • 인스턴스를 통해 노출
  • 클래스 설계 시, 고려 사항
    • 상태가 어떠한가?
      • 어떤 변수를 가지고 있는가?
    • 어떤 생성자를 가지는가?
      • 초기값 설정
    • 객체를 통해 실행하고자 하는 메서드(행동)는 무엇인가?

  • 멤버 변수 중 변할 여지가 있는 변수만 공개한다
    • 사용자가 상태를 바꾸어야 할 때
  • 꼭 전형적인 getter / setter를 사용할 필요가 없다
    • 사용자가 직관적으로 사용할 수 있도록 API 설계
    • switchOn / swithOff

  • 객체 구성 관계(Object Composition)
    • 객체 안의 객체
    • 하나의 클래스가 다른 클래스의 인스턴스에 대해 참조 역할을 하는 것
    • 클래스를 디자인할 때, 다른 객체의 관계를 살펴보는 것이 중요하다
    • 객체를 생성할 때, 필수 요소만이 생성자에 포함된다
  • 객체 중심 디자인
    • 클래스를 먼저 결정
    • 그 다음에는 각 클래스가 어떻게 구성될 지 계획

  • 상속
    • 유사한 클래스를 두 개 생성했을 때, 한 클래스의 내용이 바뀌면 다른 클래스도 일일히 바꿔야 하는 불편 발생
    • 상속을 활용하면 한 클래스에서 원하는 내용만을 가져와서 다른 클래스를 정의할 수 있음
    • extends 부모 클래스명
    • 상속을 통해 부모(super) 클래스를 확장한 새로운(sub) 클래스 생성 가능
    • 코드 재사용성
    • IS A 관계
      • Student IS A Person
      • 클래스 간 IS A 관계가 아닌 경우 상속 비추천
  • Java의 모든 클래스는 디폴트로 Object 클래스를 상속
    • 확장하지 않은 클래스는 자동으로 Object 클래스를 상속하고 있음
  • 오버라이드
    • 상위 클래스의 메서드를 하위 클래스가 재정의하여 덮어쓰는 것
    • 상위 클래스의 메서드와 동일한 메서드를 선언하여 실행부만 수정

  • super
    • 부모(상위) 클래스에 접근
    • 자식 클래스의 생성자는 super()를 함축적으로 내포하고 있다
      • 아무 생성자도 선언하지 않으면 상위에서 함축적으로 인수 생성자를 호출하지 않는다
      • 아무 인수가 없는 생성자를 호출한다
      • 상위에서 인수 생성자를 정의했다면 하위에서 해당 생성자를 가진 생성자를 선언해야 한다
  • Java는 다중 상속을 지원하지 않는다
  • 상속 계층
    • 하나의 하위 클래스가 또 다른 클래스의 상위 클래스가 되는 것(Object-Animal-Pet-Dog)
  • 하위 클래스 변수가 상위 클래스의 참조 변수에 존재할 수 있다
    • 반대는 불가능
    • ex:) Pet pet = new Dog();
  • instanceof
    • 객체(인스턴스)가 특정 클래스의 하위 클래스인지 판단하는 메서드
    • pet instanceof Animal

  • 추상 클래스
    • abstract 키워드 사용
    • 추상 클래스 메서드의 정의는 하위 클래스에서 진행
      • 정의도 없고 형태도 없는 메서드
      • 선언만 되어 있음
    • 추상 클래스의 인스턴스는 생성할 수 없다
    • 공통 알고리즘이 있으나 세부 절차가 다른 경우에 유용
      • ex:) 요리법(준비-요리-정리)
    • 추상 메서드 없이 추상 클래스 생성 가능
      • but, 의미 없음
    • 추상 클래스가 다른 추상 클래스를 확장할 수 있음
      • 추상 메서드를 구체화할 필요 없음
    • 추상 클래스도 일반 변수와 메서드를 가질 수 있다
abstract class AbstractAnimal
{
	// 추상 메서드
	abstract public void bark();
}

class Dog extends AbstractAnimal
{
	public void bark()
    {
    	System.out.println("Bow Bow");
    }
}

Dog dog = new Dog();
dog.bark();
Bow Bow

  • 인터페이스
    • 공통적인 시행 가능 행동들을 대표하여 여러 구현 클래스에 제공하는 것
    • 조이스틱의 버튼을 공통적으로 사용하지만 그 사용법에 대해서는 게임에 따라 다르다
    • 인터페이스의 메서드는 선언만 할 뿐 정의하지 않는다
    • 다형성
      • 하나의 인터페이스를 여러 형태로 구현할 수 있다
  • 인터페이스의 활용
    • 서로 다른 프로젝트 간의 소통 방식 제공
    • 외주 팀이 구현하기 전 미리 모조 구현 진행 가능
      • 이후, 참조를 달리하여 프로젝트 수정 가능
    • 외부 인터페이스가 실제 사용 가능한 상태가 아니어도 작업을 계속할 수 있도록 도움
    • 소통하는 두 클래스 간의 통신 계약
    • 특정 클래스가 확실히 구현할 메소드들을 정의
  • 인터페이스를 다른 인터페이스가 확장 가능
    • 다른 인터페이스를 확장하는 인터페이스의 구현 클래스는 두 인터페이스를 모두 구현해야 한다
    • 추상 클래스를 활용하면 메서드들의 일부만 구현 가능
    • 이 추상 클래스를 연장하려면 모든 인터페이스를 구현해야 한다
interface Interface1
{
	void method1();
}

interface Interface2
{
	void method2();
}

class Implementation implements Interface2
{
	public void method2() { };
    public void method1() { };
}

abstract class AbstractImplementation implements Interface2
{
	public void method1() { };
}
  • 인터페이스 내부에서는 상수만 생성
interface Interface3
{
	// int test; [X]
    int test = 5;
}
  • Java 8부터 인터페이스의 기본 메서드가 특정 인터페이스의 기본적 구현을 제공할 수 있다
    • default 키워드
    • 인터페이스의 메서드를 구현하지 않으면 기본 구현을 받는다
      • 특정 인터페이스의 구현자 오버라이드 가능
    • 기본 메서드는 인터페이스를 연장할 때 사용
      • 인터페이스의 구현자가 컴파일 에러를 발생하지 않도록 한다
interface Interface4
{
	default void print()
    {
    	System.out.println("default");
    }
}

class Test implements Interface4
{

}

Test test = new Test();

test.print(); // default

class Test2 implements Interface4
{
	// 오버라이드
	public void print()
    {
    	System.out.println("override");
    }
}

Test1 test = new Test1();

test.print(); // override
interface Test
{
	void nothing();
	
    // 새로운 메서드를 추가하면 모든 구현 클래스에 해당 메서드를 추가해야 함
	// void nothing1();
	// default로 기본 메서드를 제공하면 컴파일 에러를 방지할 수 있음
	default void nothing1()
	{
			
	};
}
	
class Class1 implements Test
{

	@Override
	public void nothing()
	{
		
	};
		
}
	
class Class2 implements Test
{

	@Override
	public void nothing()
	{
			
	};
		
}

  • 인터페이스 vs. 추상 클래스
    • 인터페이스
      • HAS -A "...할 수 있는"
      • 기본 설계도
      • 두 시스템 사이에 소통하길 원할 때
      • 두 클래스 혹은 컴포넌트가 소통하길 원할 때
      • 메서드 = 소통 방식
      • 접근 제한자 사용X (공개형)
      • 변수 사용X
      • 하나의 클래스가 여러 인터페이스 구현 가능
      • 상속 관계를 쭉 타고 올라갔을 때 다른 조상 클래스를 상속하는데 같은 기능이 필요할 경우
      • ex:) flyable() -> bird / airplane
      • 수행 가능한 공통된 행동들을 대표
    • 추상 클래스
      • 미완성 설계도
      • IS -A "...이다"
      • 높은 단계의 구조를 제공하고 싶을 때
      • 세세한 구현은 하위 클래스에 맡기고자 할 때
      • 모든 하위 클래스가 상위 클래스와 합치하고자 할 때
      • 추상 클래스를 사용하려면 상속을 활용해야 한다
      • 상속을 위한 클래스(객체 생성 불가능)
      • 변수 사용 가능
      • 한 클래스가 여러 추상 클래스 연장 불가능
      • 상속 관계를 쭉 타고 올라갔을 때 같은 조상 클래스를 상속하는데 기능까지 완전히 똑같아야 하는 경우
      • ex:) bark() -> dog / cat

  • 다형성
    • 같은 코드와 참조 변수를 사용하지만 객체에 따라 다른 행동 양식을 보이는 것
    • ex:) bark -> dog / cat

  • [Tip] 97 Things Every Programmer Should Know
profile
There's Only One Thing To Do: Learn All We Can

0개의 댓글