[Java] [객체지향]추상화(abstraction)(2)
카테고리: Java
태그: coding Programming Java
## 추상화
- 캡슐화의 원칙에는 일부 어긋나긴 하지만 다른 목적을 가진 클레스와 객체를 추상화 하는 기법이 있다
- 행위 위주가 아닌 데이터를 하나로 뭉치기 위한 객체(Date Transfer Object)의 경우이다
- 이러한 객체를 설계할 때는 행위가 아닌 데이터가 위주이며, 캡슐화의 원칙을 준수하여 모든 필드를 private 로 직접 접근을 막고, 각 필드값을 변경하거나 반환하는 메소드를 세트로 미리 작성해둔다
- 어떤것을 쓸 줄 모르니 미리 다 준비해두는 종합선물세트 같은 개념이다
- private 필드와 필드값을 수정하는 설정자(setter), 필드에 접근하는 접근자(getter)들로 구성된다
-
주로 계층간 데이터를 주고 받을 목적으로 사용한다
- Application
package section03.dto;
import section01.user_type.Member;
public class Application {
public static void main(String[] args) {
MemberDTO member = new MemberDTO();
member.setNumber(1);
member.setName("홍길동");
member.setAge(21);
member.setGender('여');
member.setHeight(160);
member.setActivated(true);
System.out.println("회원번호 : " + member.getNumber());
System.out.println("이름 : " + member.getName());
System.out.println("나이 : " + member.getAge());
System.out.println("성별 : " + member.getGender());
System.out.println("키 : " + member.getHeight());
System.out.println("활성화상태 : " + member.isActivated());
}
}
- 캡슐화 원칙에 따라 작성을 하긴 했지만 실제로는 캡슐화가 의미가 없을 정도로 필드명을 그대로 사용한 설정자와 접근자로 인해 캡슐화 효과가 없다 (유지보수성 약하)
- 하지만 데이터를 주로 다루는 객체의 경우 행위를 추상화하지 않고 미리 모든 필드에 접근 가능성을 염두해두고 작성해두는 관례로 인해 현재도 많이 사용되고 있다
-
(엄밀히 말하자면 EJB의 java bean 작성 규칙에 따르는 것이다)
- MemberDTO
package section03.dto;
public class MemberDTO {
private int number; //회원번호
private String name; //회원이름
private int age; //나이
private char gender; //성별
private double height; //키
private boolean isActivated; //회원탈퇴 여부(활성화 여부)
public void setNumber(int number) {
this.number = number;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public void setGender(char gender) {
this.gender = gender;
}
public void setHeight(double height) {
this.height = height;
}
public void setActivated(boolean activated) {
isActivated = activated;
}
public int getNumber() {
return number;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public char getGender() {
return gender;
}
public double getHeight() {
return height;
}
/*boolean의 접근자는 get으로 시작하지 않고 is로 시작하는 것이 일반적인 관례이다*/
public boolean isActivated() {
return isActivated;
}
@Override
public String toString() {
return "MemberDTO{" +
"number=" + number +
", name='" + name + '\'' +
", age=" + age +
", gender=" + gender +
", height=" + height +
", isActivated=" + isActivated +
'}';
}
}
설정자(setter)/접근자(getter)의 경우 실무에서 암묵적으로 통용되는 작성 규칙이 존재한다.
설정자(setter)작성 규칙
- 필드값을 변경할 목적의 매개변수를 변경하려는 필드와 같은 자료형으로 선언하고 호출 당시 전달되는 매개변수의 값을 이용하여 필드의 값을 변경한다
[표현식]
public void set 필드명(매개변수) {
필드 = 매개변수 ;
}
[작성예시]
public void setName(String name) {
this.name = name;
}
접근자(getter)작성 규칙
- 필드의 값을 반환받을 목적의 메소드 집합을 의미한다
- 각 접근자는 하나의 필드에만 접근하도록 한다
- 필드에 접근해서 값을 return 을 이용하여 반환하며, 이 때 반환타입은 반환하려는 값의 자료형과 일치시킨다
[표현식]
public 반환형 get필드명() {
return 반환값;
}
[작성예시]
public void getName() {
return this.name;
}
자, 그럼 실행 해볼까??
- 실행값
회원번호 : 1
이름 : 홍길동
나이 : 21
성별 : 여
키 : 160.0
활성화상태 : true
요약. 추상화란 복잡한 것들을 단순화하고 핵심적인 부분에 집중하여 세부 사항을 숨기는 프로세스
댓글 남기기