* 10. 메뉴얼 CRUD 구현
* 클래스란 역할에 따라 메서드를 분류한 것.
* 패키지란 클래스를 분류한 것
* App에 주기능을 분류
* MemberHandler 는 회원 데이터를 다루는 메서드를 묶어놓는 것
* Prompt는 사용자 입력을 다루는 메서드를 분류한 것이다.
가장 큰 범위에서부터 순서대로 분류
패키지 (Package):
패키지는 관련된 모듈들을 디렉토리 형태로 구성한 것
여러 개의 모듈을 포함하고 있으며, 하위 패키지를 가질 수도 있다.
패키지는 대규모 소프트웨어 시스템에서 모듈들을 구조화하고 조직화하기 위해 사용
모듈 (Module):
모듈은 코드의 재사용을 위해 사용되는 파일
함수, 클래스, 변수 등을 포함할 수 있으며, 모듈은 관련 기능을 한 곳에 모아놓고,
다른 프로그램에서 임포트하여 사용할 수 있다.. 모듈은 패키지의 구성 요소로 사용될 수도 있다.
클래스 (Class):
클래스는 객체 지향 프로그래밍에서 객체를 생성하기 위한 설계도
클래스는 속성(attribute)과 메서드(method)로 구성되어 있으며, 객체의 상태와 동작을 정의한다.
클래스는 하나의 독립된 개념으로 사용되기도 하지만,
모듈 내에서 정의되어 모듈의 구성 요소로도 사용될 수 있다.
메서드 (Method):
메서드는 클래스에 속한 함수로, 특정한 동작을 정의하고 실행
메서드는 클래스의 인스턴스에 의해 호출되어 사용
메서드는 클래스 내부에서 정의되며, 클래스의 속성에 접근하여 작업을 수행하는데 사용된다.
* 클래스 관계
상속 (Inheritance):
상속은 한 클래스가 다른 클래스의 특성과 동작을 상속받는 관계입니다. 상속은 일반적으로 "is-a" 관계로 표현됩니다.
class Car {
// 자동차 클래스의 특성과 동작
}
class DumpTruck extends Car {
// 덤프트럭 클래스의 특성과 동작
}
예를 들어, 자동차와 덤프트럭이라는 두 클래스가 있다고 가정해봅시다. 자동차는 덤프트럭이라는 특수한 유형의 자동차이므로, 덤프트럭 클래스는 자동차 클래스를 상속받을 수 있습니다. 이렇게 상속을 통해 덤프트럭 클래스는 자동차 클래스의 특성과 동작을 상속받아 사용할 수 있습니다.
연관 (Association):
연관은 한 클래스가 다른 클래스와 관련성을 가지고 상호 작용하는 관계입니다.
연관은 일반적으로 "has-a" 관계로 표현됩니다.
class Person {
private Phone phone;
// 사람 클래스의 특성과 동작
}
class Phone {
// 핸드폰 클래스의 특성과 동작
}
예를 들어, 사람과 핸드폰이라는 두 클래스가 있다고 가정해봅시다. 사람은 핸드폰을 가지고 사용할 수 있으므로, 사람 클래스와 핸드폰 클래스는 연관 관계를 가질 수 있습니다. 이 관계에서 사람은 핸드폰을 가지고 있으므로 핸드폰 객체를 참조하거나 사용할 수 있습니다.
포함 (Aggregation):
포함은 한 클래스가 다른 클래스를 포함하고 있는 관계로, 전체와 부분 간의 관계를 표현합니다.
포함은 일반적으로 "has-a" 관계로 표현되며, 전체 객체의 생명 주기에 따라 부분 객체도 생성되고 소멸됩니다.
class Computer {
private Keyboard keyboard;
private Mouse mouse;
// 컴퓨터 클래스의 특성과 동작
}
class Keyboard {
// 키보드 클래스의 특성과 동작
}
class Mouse {
// 마우스 클래스의 특성과 동작
}
예를 들어, 컴퓨터는 키보드와 마우스를 포함하고 있으므로, 컴퓨터 클래스와 키보드, 마우스 클래스는 포함 관계를 가질 수 있습니다. 이 관계에서 컴퓨터를 생성하면 키보드와 마우스도 함께 생성되며, 컴퓨터가 소멸하면 키보드와 마우스도 함께 소멸됩니다.
복합 관계(Composition)
클래스가 다른 클래스를 포함하면서 더 강한 종속성을 가지는 관계입니다.
복합 관계는 전체와 부분 간의 관계로서 전체 객체가 부분 객체를 포함하며, 부분 객체는 전체 객체에 속하고 전체 객체의 생명 주기에 종속적입니다.
복합 관계는 "whole-part" 관계로도 알려져 있으며, 일반적으로 "has-a" 관계로 표현됩니다.
클래스의 구성 요소인 부분 객체는 전체 객체와 논리적으로 강하게 연결되어 있습니다.
부분 객체는 전체 객체의 일부분이며, 전체 객체의 생명 주기에 따라 생성되고 소멸됩니다.
class Engine {
// 엔진 클래스의 특성과 동작
}
class Car {
private Engine engine;
// 자동차 클래스의 특성과 동작
}
위의 예시에서는 자동차와 엔진 간의 복합 관계를 보여줍니다. 자동차 클래스는 Engine 클래스를 포함하고 있으며,
Engine 객체는 자동차 객체에 종속적입니다. 자동차가 생성될 때 엔진도 함께 생성되며, 자동차가 소멸될 때 엔진도 함께 소멸됩니다.
복합 관계는 클래스 간의 강한 종속성을 표현하고, 객체 지향 설계에서 더 세부적인 구성 요소를 표현하기 위해 사용됩니다. 이를 통해 클래스 간의 복잡한 관계를 모델링하고 객체들 사이의 구조를 명확하게 표현할 수 있습니다.
합성(Composition)
클래스가 다른 클래스를 포함하면서 더 강한 종속성을 가지는 관계입니다. 합성 관계는 전체와 부분 간의 관계로, 전체 객체가 부분 객체를 구성하는 관계입니다. 부분 객체는 전체 객체의 일부분이며, 전체 객체의 생명 주기에 종속적입니다.
합성 관계는 "whole-part" 관계로도 알려져 있으며, 일반적으로 "has-a" 관계로 표현됩니다. 클래스의 구성 요소인 부분 객체는 전체 객체와 논리적으로 강하게 연결되어 있으며, 전체 객체의 생성과 소멸에 따라 부분 객체도 함께 생성되고 소멸됩니다.
class Engine {
// 엔진 클래스의 특성과 동작
}
class Car {
private Engine engine = new Engine();
// 자동차 클래스의 특성과 동작
}
위의 예시에서는 자동차와 엔진 간의 합성 관계를 보여줍니다. 자동차 클래스는 Engine 클래스를 포함하고 있으며, Car 클래스의 인스턴스가 생성될 때 Engine 객체도 함께 생성됩니다. 엔진 객체는 자동차의 일부분이며, 자동차의 생성과 소멸에 따라 함께 생성되고 소멸됩니다.
합성 관계는 클래스 간의 강한 종속성을 표현하고, 객체 지향 설계에서 객체들 간의 구성을 표현하기 위해 사용됩니다. 이를 통해 클래스들 간의 복잡한 구조와 의존성을 명확하게 표현할 수 있습니다. 합성 관계는 전체와 부분 간의 관계를 강조하며, 전체 객체가 부분 객체를 구성하는 구조를 나타냅니다.
의존(Dependency) 관계
한 클래스가 다른 클래스에 의존하여 해당 클래스의 기능을 사용하거나 상호 작용하는 관계입니다. 의존 관계는 한 클래스가 다른 클래스의 인스턴스를 사용하는 것을 의미하며, 이를 통해 클래스 간의 상호 작용과 협력을 구현할 수 있습니다.
의존 관계는 일반적으로 "uses-a" 관계로 표현되며, 한 클래스가 다른 클래스의 객체를 사용하여 작업을 수행합니다. 의존 관계에서는 의존하는 클래스는 의존 대상 클래스에 종속적이며, 대상 클래스의 변경이 의존하는 클래스에 영향을 줄 수 있습니다.
의존 관계의 예시를 살펴보겠습니다:
class Logger {
public void log(String message) {
// 로그 메시지를 기록하는 기능
}
}
class OrderProcessor {
private Logger logger = new Logger();
public void processOrder(Order order) {
// 주문 처리 로직
logger.log("주문이 처리되었습니다.");
}
}
위의 예시에서는 OrderProcessor 클래스가 Logger 클래스에 의존하고 있습니다. OrderProcessor는 주문 처리 로직을 수행하는데, 주문 처리가 완료되면 Logger 객체를 사용하여 로그 메시지를 기록합니다. 이 경우, OrderProcessor 클래스는 Logger 클래스의 기능을 사용하여 동작을 수행하므로, OrderProcessor 클래스는 Logger 클래스에 의존성을 가지고 있습니다.
의존 관계를 통해 클래스들 간의 협력과 상호 작용을 구현할 수 있습니다. 의존 관계는 한 클래스가 다른 클래스의 기능을 사용하거나 협력하여 작업을 수행하는 방식으로 객체 지향 프로그래밍에서 중요한 개념입니다. 의존 관계를 적절하게 설계하고 관리함으로써 유연하고 확장 가능한 코드를 작성할 수 있습니다.
* 11. 사용자 정의 데이터 타입 만들기
user-defind Data Type
→ 프로젝트에서 다루는 데이터를 담을 메모리를 설계
JAVA → Primitive Data Type : byte , short , int, long, char, float, double, bolean
user Definded Data Type : String, Date, Calender, ArrayList
* 클래스 문법 용도
Class문법 → 메서드를 유지보수하기 좋게 분류하기 "메서드 분류"
프로젝트에서 다룰 데이터 타입 설계하기 "데이터 타입"과 "연산자" 설계
* 클래스와 인스턴스
* 인스턴스 instance (사례)
int : 0
String : null
char : \u0000
boolean : false
float : 0.0
비어있는 값을 지정해줄 때는 이렇게 표기해준다.
(인간을 위한 고차원적인 표현)
* 레퍼런스 (reference)
class obj = new Member();
* obj는 인스턴의 주소를 담는 변수
예를 들어, 다음과 같은 코드가 있다고 가정해봅시다:
Member obj = new Member();
위의 코드에서 Member 클래스의 객체를 생성하고,
이 객체를 가리키는 obj라는 레퍼런스 변수를 선언하고 초기화하고 있습니다.
new Member()는 Member 클래스의 인스턴스를 생성하고, 이 인스턴스의 메모리 주소를 obj 변수에 저장합니다.
따라서, obj 변수는 Member 클래스의 인스턴스를 가리키는 레퍼런스가 되며, 이를 통해 해당 인스턴스에 접근하고 해당 인스턴스의 멤버 변수나 메서드를 호출할 수 있습니다. 레퍼런스를 통해 객체에 접근하는 것은 실제 객체 자체에 대한 주소를 담는 변수이기 때문에, 객체를 조작하고 활용할 수 있는 방법을 제공합니다.
* 인스턴스와 변수
(인스턴스 필드)
Member obj = new Member()
obj. no = 100;
ㄴ레퍼런스 ㄴ인스턴스 필드
* 레퍼런스, 인스턴스, 가비지
레퍼런스와 인스턴스 변수는 객체 지향 프로그래밍에서 객체의 생성과 가비지 컬렉션에 영향을 준다.
이를 통해 가비지가 생성되는 과정 :
1. 객체 생성:
객체가 생성되면, 해당 객체를 가리키는 레퍼런스 변수가 생성됩니다. 이 레퍼런스 변수는 객체의 메모리 주소를 저장하게 됩니다.
2. 인스턴스 변수의 할당:
객체는 클래스의 인스턴스로, 해당 클래스의 인스턴스 변수를 가지고 있습니다. 인스턴스 변수는 객체의 상태를 나타내고 객체의 데이터를 저장합니다. 인스턴스 변수는 객체가 생성될 때마다 해당 객체의 메모리 공간에 할당됩니다.
3. 레퍼런스 변수의 할당:
객체를 가리키기 위해 레퍼런스 변수에 해당 객체의 메모리 주소가 할당됩니다. 이렇게 객체를 참조하는 레퍼런스 변수가 존재하면, 해당 객체는 메모리에서 해제되지 않습니다.
4. 레퍼런스 변수의 해제:
객체를 가리키는 모든 레퍼런스 변수가 더 이상 해당 객체를 참조하지 않을 때, 객체는 가비지가 될 수 있습니다. 이는 객체의 레퍼런스 카운트(reference count)가 0이 되는 시점입니다. 즉, 객체에 접근할 수 있는 레퍼런스가 없을 때 해당 객체는 가비지가 됩니다.
5. 가비지 컬렉션:
가비지 컬렉션은 프로그램에서 사용되지 않는 메모리를 자동으로 회수하는 메커니즘입니다. 가비지 컬렉터는 주기적으로 실행되며, 가비지로 판단되는 객체들을 탐지하여 해당 객체가 차지하던 메모리를 해제합니다. 이렇게 해제된 메모리는 다른 객체나 데이터에 재사용될 수 있습니다.
* 레퍼런스 배열
* 인스턴스 배열을 만드는 문법은 없다 !
* 만약 인스턴스를 100개 생성한다면 인스턴스 주소를 100개 담을 레퍼런스를 100개 선언해야 한다 !
NEW는 Heap에 생성
Static 인스턴스 변수는 Method Area에 생성
* 11. 사용자 정의 데이터 타입 만들기