자바와 객체지향
캡슐화, 은닉화
- 자바 객체는 속성을 바로 사용하지 않는다. 객체 밖에서 직접 접근된 데이터는 조작했을 가능성이 있다.
- 따라서 객체지향 프로그래밍에서 캡슐화, 은닉화란 객체의 데이터를 밖에서 바로 접근하지 못하도록 숨기는 것을 말한다.
- 이때 게터, 세터, 접근 제한자 사용
- 경우에 따라서는 게터와 세터 자체를 사용하지 않는다.
객체지향 사고방식
- 객체지향 프로그래밍에서의 주어는 객체이다.
- 객체지향 프로그래밍은 현실 세계와 유사하게 모델링 하긴 하지만 꼭 그런 것은 아니다.
복잡한 시스템을 만들기 위해 반드시 알아야 하는 몇 가지 개념
- 클래스로 만들어야 하는 대상을 정확히 파악할 것.
- 객체와 객체 간의 의사소통 관계를 정확히 파악하고 설계할 수 있을 것.
- 하나의 클래스들이 나중에 재사용이 최대한 가능하도록 설계 시 반영할 수 있을 것
- 고객이 진정으로 원하는 것이 어떤 것인지 파악하는 능력.
=> 즉 자신이 무엇을 어떻게 만들어야 할지 정확히 알고 있어야 한다.
클래스 구성의 가장 중요한 원칙
- 고객*이 관심 두는 데이터는 클래스로
- 연관된 데이터(도표)는 클래스로
- 데이터가 주가 되는 객체와 그 데이터 객체들을 가지고 처리하는 객체들 고려
*고객은 제품을 구매하는 고객뿐만 아니라 동료직원, 회사 등 넓은 범위를 의미한다.
객체지향에서 중요한 관점
- 객체와 객체들이 의사소통하는 구조로 되어있다. 데이터를 표현하는 클래스가 있고 이걸 화면에 보여주는 객체(컨트롤러), 데이터를 처리하는 객체(DAO), 비즈니스 로직을 처리하는 객체(서비스)가 존재하며 이들이 서로 의사소통하듯 데이터를 주고받아(DTO) 작업을 수행한다.
- 객체지향으로 시스템을 설계하는 능력이라는 것은 이런 구조를 떠올리며, 각자의 역할에 맞게 기능을 구현할 수 있는 능력을 말한다.
프로그램을 만드는 순서 정리
- 가장 중요한 데이터를 객체로 보관하기 위해서 클래스를 작성한다.
이런 데이터의 특징
- 장부나 도표의 형태로 관리되는 데이터
- 매출을 일으키는 데이터, 또는 그런 데이터와 연관된 데이터
- 비즈니스 객체(서비스) 설계
비즈니스 객체의 특징
- 고객의 요구사항을 반영해서 비즈니스 로직을 만든다. 이 로직을 구현할 수 있는 메소드를 작성한다.
- 각 메소드의 파라메터는 가능하면 데이터 객체를 받는다.
- 화면을 담당하는 별도의 객체(컨트롤러) 설계
- 데이터를 보관하고 처리하는 객체(DAO) 설계
즉 데이터를 클래스로 정의하고, 데이터와 연관된 다른 역할의 클래스들을 설계하고 구현한다. 각 역할에는 비즈니스 로직을 구현하는 역할, 데이터를 받아서 처리하는 역할, 처리된 데이터를 받아 화면에 보여주는 역할 등이 있을 수 있다.
static
- JVM은 클래스와 인터페이스에 대한 정의를 메소드 영역이라는 곳에 불러온다. 그리고 객체들은 힙 영역에 존재한다. static 변수, 메소드는 클래스에 대한 정보가 로드될때 함께 메소드 영역에 불려진다.
- 알아둬야할 것은 메모리 관련된 것인데, 메소드 영역은 가비지 컬렉터가 관리하지 않아 메모리에 항상 상주하게 된다. static으로 어떤 데이터나 객체를 연결해서 사용하게 되면 메모리 회수가 안된다. 문제는 개발시에는 문제가 느껴지지 않으며 프로그램이 가동된지 몇 주, 몇 달이 지나면 느려지기 시작한다. 따라서 static 사용은 조심해야한다.
- JVM의 Run-Time Data area
다형성
하나의 객체를 여러 타입으로 선언할 수 있음. java에서 다형성은 상속과 interface 구현을 통해 이루어진다.
interface SmartPhone {}
class iPhone implements SmartPhone{}
class GalaxyPhone implements SmartPhone{}
SmartPhone phone = new iPhone();
SmartPhone phone2 = new GalaxyPhone();
interface
- 인터페이스는 스펙을 정의하기 위해 사용한다.
- 인터페이스는 서로 다른 클래스의 객체들이 같은 타입으로 인식할 수 있게 한다(다형성). 인터페이스에 공통 기능을 정의하고 클래스들이 그것을 구현했다면, 인터페이스 타입으로 여러 종류의 객체들을 처리할 수 있다.
- 비슷한 의미로, 인터페이스에 공통된 기능들을 정의했다면, 실제 객체가 무엇인지 몰라도 코드를 작성할 수 있다. 여러 개발자가 함께 작업할때 구체적인 코드를 신경쓰지 않고 인터페이스에 의존해서 작업하는 것이 가능하다.
그 외
- 자바 객체를 비교하거나 연산을 하기 위해서 혹은 자바 자료구조를 잘 활용하기 위해서는 객체 클래스에 hashCode(), equals(), compareTo() 같은 메소드를 구현하여 활용할 수 있다.