Day31(객체지향

객체 지향 프로그래밍

– 메시지는 개체가 서로 협력하기 위해 사용할 수 있는 유일한 통신 수단입니다.

– 객체가 메시지를 수신할 수 있다면 메시지에 해당하는 책임을 다할 수 있음을 의미합니다.

– 물체의 외부와 내부는 당연히 분리되어 있습니다. 외부 물체는 메시지만 볼 수 있고 내부는 볼 수 없기 때문입니다.

– 독립된 객체의 상태와 동작에 대한 걱정 없이 시스템의 기능을 구현 개체가 다른 개체에 전달해야 하는 메시지에 대해 더 걱정그것을 추천합니다

– Responsibility-Driven Design의 기본 아이디어는 객체 간에 교환되는 메시지를 기반으로 적절한 역할, 책임 및 협업을 발견하는 것입니다.

– What/Who 주기는 어떤 행동(메시지)을 취할 것인지 결정하고, 누가 그 행동을 취할 것인지 생각하고, 어떤 메시지가 필요한지 결정한 다음 적절한 대상을 선택하는 것으로 구성됩니다. 즉, 받은 메시지가 개체의 책임을 결정합니다.

– 인터페이스는 사물이 만나는 경계점에서 서로 상호 작용할 수 있도록 연결하는 장치 또는 방법입니다. 예를 들어 인간 대 인간 인터페이스는 말, 몸짓, 손짓, 휴대폰이 될 수 있습니다.


– 생성자란?
Bar에서 생성자는 개체를 초기화하는 특별한 종류의 메서드입니다. 생성자는 클래스와 이름이 같고 반환 값이 없습니다. 개체가 생성될 때 자동으로 호출되며 개체의 인스턴스 변수를 초기화하고 다른 초기화 작업을 수행합니다.

생성자는 다음과 같은 특징이 있습니다.

  • 생성자 이름은 클래스 이름과 동일합니다.
  • 생성자는 반환 값이 없으며 유효하지 않은 것으로 선언되지 않습니다.
  • 생성자는 객체가 생성될 때 자동으로 호출됩니다.
  • 생성자는 오버로드될 수 있습니다.
  • 생성자는 매개변수를 가질 수 있고 매개변수로 초기화 작업을 수행할 수 있습니다.

예를 들어 다음은 생성자를 사용하여 Person 클래스의 인스턴스 변수를 초기화하는 예입니다.

public class Person { 
	private String name; 
    private int age;
    
	public Person(String name, int age) { 
		this.name = name; 
        this.age = age; 
 	} 
}

위의 코드에서 Person 클래스에는 Name과 Age라는 두 개의 인스턴스 변수가 있습니다. 생성자는 이름과 연령을 매개변수로 사용하고 개체의 인스턴스 변수를 초기화합니다. 이것이 객체를 생성할 때 초기화된 이름과 나이로 객체를 생성합니다.

-작업

작업은 개체 지향 프로그래밍에서 개체가 수행할 수 있는 작업입니다. Java에서 작업은 일반적으로 클래스 내의 메서드로 구현됩니다.

작업은 개체가 수행할 수 있는 작업을 추상화하여 개체의 동작을 정의합니다. 개체는 작업을 수행하는 다른 개체와 메시지를 주고 받습니다. 이러한 개체 간의 상호 작용은 개체 지향 프로그래밍에서 중요한 개념 중 하나입니다.

Java에서 클래스는 객체를 추상화하는 데 사용되며 객체의 작업은 메서드로 구현됩니다. 메서드는 클래스 내에서 정의되며 개체가 수행할 수 있는 작업을 정확하게 정의합니다. 메서드는 개체의 속성을 변경하고 다른 개체와 상호 작용하며 결과 값을 반환할 수 있습니다.

-커플링 정도

결합은 객체 지향 프로그래밍의 한 모듈이 다른 모듈에 의존하는 정도입니다. 즉, 한 모듈이 다른 모듈에 얼마나 강력하게 연결되어 있는지입니다. 결합도가 높다는 것은 모듈 간의 의존도가 높다는 것을 의미하며, 이는 유지 관리 및 확장성에 부정적인 영향을 미칠 수 있습니다.

Java에서 연관성을 줄이려면 다음을 사용할 수 있습니다.

  1. 추상화: 추상화는 구체적인 구현을 추상 개념으로 대체하는 것을 의미합니다. 추상화를 사용하면 모듈의 구현 세부 정보를 숨길 수 있으므로 다른 모듈에 대한 모듈 구현의 직접적인 종속성을 줄일 수 있습니다.
  2. 인터페이스: 인터페이스는 모듈이 다른 모듈과 상호 작용할 수 있는 방법을 정의하는 추상화 형식입니다. 인터페이스를 사용하여 모듈 간의 결합을 줄일 수 있습니다.
  3. 종속성 주입: 종속성 주입은 모듈이 다른 모듈을 직접 참조하지 않고 모듈이 필요로 하는 종속 개체 외부에서 주입하는 기술입니다. 이렇게 하면 모듈 간의 결합 정도를 줄일 수 있습니다.
  4. 패키지 구조: 패키지 구조는 모듈을 그룹화하고 모듈 간의 관계를 정의하는 방법입니다. 케이스 구조를 잘 설계하면 모듈 간의 결합을 줄일 수 있습니다.

연관성은 객체 지향 프로그래밍에서 가장 중요한 개념 중 하나입니다. 모듈 간의 결합이 적어 유지 관리성과 확장성이 향상됩니다.

-목록 및 ArrayList

Java의 List 인터페이스는 추상적인 개념이며 List 유형의 개체를 만들 수 없습니다. 따라서 List를 구현하는 클래스 중 하나를 선택하여 객체를 생성해야 합니다. ArrayList는 List 인터페이스를 구현하는 클래스 중 하나이며 동적으로 크기가 조정된 배열을 사용하여 요소를 저장하기 때문에 널리 사용됩니다.

그래서 계략 list = new ArrayList<>(); 구문은 List 인터페이스를 구현하는 ArrayList 클래스의 객체를 생성하고 이를 목록 변수에 할당하는 것입니다. 이러한 방식으로 목록 변수는 ArrayList 개체를 참조합니다.

– List와 ArrayList의 차이점

ArrayList 사이에는 중요한 기능적 차이가 없습니다. list = new ArrayList<>(); 그리고 교활한 목록 = 새 ArrayList<>();. 그러나 두 명령문의 차이점은 변수 유형에 있습니다.

배열목록 클래스 유형을 직접 지정하고 목록 인터페이스 유형을 사용합니다. 인터페이스 유형을 사용하면 유연성이 향상됩니다. 예를 들어 나중에 코드에서 List 구현을 변경해야 하는 경우 List 유형을 사용하면 구현만 변경하면 되므로 코드를 더 쉽게 변경할 수 있습니다.

따라서 코드를 작성할 때 가능한 한 인터페이스 유형을 사용하는 것이 좋습니다. 그러나 구현의 특정 기능을 사용해야 하는 특정 경우에는 구현 유형을 사용해야 할 수 있습니다.

-구현

구현은 인터페이스를 구현하는 클래스를 의미합니다. 인터페이스는 추상 메서드 집합이며 인터페이스에서 상속하는 구현 클래스는 해당 인터페이스의 모든 추상 메서드를 구현해야 합니다. 구현체를 이용하여 인터페이스에 정의된 사양에 따라 동작하는 객체를 생성할 수 있으며, 객체를 생성한 후 인터페이스에 정의된 메서드를 호출하여 객체를 사용할 수 있습니다. 구현은 다형성 개념을 구현하는 데 사용되므로 동일한 인터페이스를 구현하는 다른 구현을 사용할 수 있습니다.

-상호 작용

인터페이스는 객체지향 프로그래밍에서 클래스나 다른 인터페이스에서 구현할 메서드의 프로토타입(시그니처)만을 선언하는 추상 클래스입니다. 즉, 인터페이스는 클래스가 가져야 하는 메소드의 이름, 매개변수, 반환값 등을 정의하는 데 사용된다.

인터페이스에는 다음 속성이 있습니다.

  1. 추상화: 인터페이스는 구현 세부 사항을 숨기고 필요한 동작만 정의하는 추상화 형식입니다.
  2. 다중 상속: 클래스는 단일 상속만 허용하지만 인터페이스는 다중 상속을 허용합니다. 따라서 여러 인터페이스를 구현하여 클래스가 여러 작업을 수행하도록 할 수 있습니다.
  3. 표준화: 인터페이스는 메서드의 서명만 선언하므로 여러 클래스가 동일한 메서드 이름, 매개 변수 및 반환 값을 사용할 수 있습니다. 이렇게 하면 코드가 더 일관되고 읽기 쉬워집니다.

인터페이스를 사용하면 다른 클래스가 해당 인터페이스를 구현하여 동일한 메서드를 제공할 수 있습니다. 인터페이스를 구현하는 클래스는 인터페이스에 선언된 모든 메서드를 구현해야 클래스 간의 결합이 줄어들고 유연성이 증가합니다.