[Java] [객체지향]추상화(abstraction)(2)

Date:     Updated:

카테고리:

태그:

java.png

## 추상화

  • 캡슐화의 원칙에는 일부 어긋나긴 하지만 다른 목적을 가진 클레스와 객체를 추상화 하는 기법이 있다
  • 행위 위주가 아닌 데이터를 하나로 뭉치기 위한 객체(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

요약. 추상화란 복잡한 것들을 단순화하고 핵심적인 부분에 집중하여 세부 사항을 숨기는 프로세스

하루하루 시간이 너무 빠르다.. 빨리 나도 멋지게 개발자로 활약하는 그날이 오길~~

Java 카테고리 내 다른 글 보러가기

댓글 남기기