객체 : 개체, 속성과 메소드로 구성된 클래스의 인스턴스를 의미한다
속성(애트리뷰트) : 자료 구조, 변수, 데이터, 성질, 분류, 식별, 수량, 상태를 의미한다
메소드 : 행위, 기능, 함수, 프로시저, 연산 등을 의미한다 (메소드는 동사형, 객체는 명사형이다)
객체지향 기술은 대형 프로그램 개발에 적당하고 객체를 이용하기 때문에 신속하게 개발을 할 수 있지만, 객체 자체의 설계가 어렵고 객체의 규모가 크기 때문에 실행 속도가 느리다.
클래스
- 데이터를 추상화하는 단위이다
- 객체의 타입을 정의하고 객체를 생성하는 틀을 의미한다
- 문제 해결을 위한 같은 종류의 집단에 속하는 속성과 행위를 정의한 것이다
인스턴스
- 실행 중인 임의의 프로세서, 클래스의 현재 생성된 객체를 가리킨다
- 클래스로 정의된 객체의 복사본이라고 할 수 있다
메시지 : 객체 사이의 인터페이스 형식. 메시지를 주고 받으면서 객체 간의 상호작용이 이루어 짐
캡슐화
- 구조적 설계에서 모듈화와 같은 의미로 객체를 정의할 때 연관된 속성과 방법을 한 테두리로 묶는 것을 의미
- 재사용이 용이하고 중복성을 최소화한다
- 정보 은폐로 내부 자료의 일관성이 유지된다
-가독성이 좋아 유지보수가 용이하고 변경이 발생할 때 오류의 파급 효과가 적다
추상화
- 불필요한 것은 제외하고, 공통적으로 사용 가능한 큰 틀을 구상한다
- 변수에 대한 데이터 타입을 정의하고, 상세한 부분은 다루지 않는 추상적인 형태로 구조화한다
- 복잡한 문제의 본질을 이해하기 위해 세부 사항은 배제하고 중요한 부분을 중심으로 간략화하는 기법
ex) 소프트웨어공학 교수, 정보통신공학 교수, 정보보안 교수 등을 추상화하면 교수가 된다.
반대로 교수를 객체화하면 저런 교수들이 되는 것이다.
상속과 구체화
- 상속은 상위 클래스의 속성과 메소드를 하위 클래스가 내려받아 사용하는 것이다
- 구체화는 하위 수준(자식) 그룹이 상위 수준(부모) 그룹의 추상적인 부분을 구체화시키는 것을 의미한다
- 다중 상속은 하나의 객체가 여러 개의 상위 클래스로부터 속성과 메소드를 상속받는 것을 의미한다
다형성
- 상속받은 여러 개의 하위 객체들이 다른 형태의 특성을 갖는 객체로 이용될 수 있는 성질
■ 객체지향 분석 방법론의 종류
객체지향 분석의 순서
객체 모델링 -> 동적 모델링 -> 기능 모델링
Rambaugh(람바우) Method
- 객체지향 분석을 3개의 모형인 객체 모형, 동적 모형, 기능 모형으로 분리하여 접근하는 방법
- 가장 대표적인 방법론
E-R 다이어그램 : 데이터 구조들과 그들 간의 관계들을 표현하고 객체 모형을 만드는 방법론
Booch Method : 미시적 개발 프로세스, 거시적 개발 프로세스로 접근하는 방법
Coad와 Yourdon Method : E-R 다이어그램을 사용함
Jacobson Method : 사용자가 제품 또는 시스템과 어떻게 상호 작용하는지를 서술한 시나리오로 접근
Wirfs - Brocks Method : 분석과 설계 프로세스 간에 뚜렷한 구분이 없음
■ 객체지향 설계
객체 모델, 동적 모델, 기능 모델을 설계하고 시스템(인터페이스)를 결정한다
단일 책임의 원칙(SRP) : 객체는 하나의 책임만 맡아 처리할 수 있어야 한다 (낮은 결합도, 높은 응집성)
개방 폐쇄 원칙 (OCP) : 소프트웨어 개체는 확장에는 열고, 수정 시에는 닫혀있게 해야한다
리스코프 치환의 법칙(LSP) : 서브타입(하위 클래스)은 어디에서나 자신의 기반 타입(상위 클래스)로 교체할 수 있어야 한다
인터페이스 분리의 원칙(ISP) : 클라이언트는 자신이 사용하지 않는 메소드와 의존 관계를 맺거나 영향을 받아서는 안된다
의존성 뒤집기의 원칙 (DIP) : 추상화 클래스에 의존하게 되므로, 구체적인 클래스에 의존하지 않도록 해야한다
■ 자바 언어
객체 생성 코드
- 클래스명 객체 변수명 = new 클래스명(); == mathCircle m = new mathCircle();
상속 코드 (클래스 이름 쓰는곳에 적는것)
- class 하위클래스명 extends 상위클래스명{ } == class Mid_Student extends Ele_Student{ }
- 자바는 기본적으로 다중 상속을 할 수 없는데, 이를 가능하게 하는 것이 interface, implements 이다
- interface 상위 클래스명{ }
- class 하위 클래스명 implements 상위 클래스명{ } 으로 사용하면 된다
접근 지정자
- private : 외부 객체에서 사용할 수 없고, 자신의 클래스에서만 사용 가능하다
- default(생략 시) : 하위 클래스나 다른 패키지에서는 사용할 수 없고, 자신의 클래스와 같은 패키지에서 사용할 수 있다
- protected : 다른 패키지에서 사용할 수 없고, 자신의 클래스와 같은 패키지, 하위 클래스에서 사용할 수 있다
- public : 모든 객체에서 사용할 수 있으며, 가능한 사용하지 않는 것을 원칙으로 한다
오버로딩 : 하나의 클래스 안에서 동일한 이름을 가진 메소드를 사용하는 기술이다 (같은 이름이여도 입력 인자값이 다르거나 메소드의 형이 다름)
오버라이딩 : 추상 클래스에서 동일한 메소드명과 인수를 정의해주면, 메소드 안의 프로그램은 상속받은 클래스에서 다양하고 독립적으로 프로그래밍을 할 수 있도록 한다는 개념