일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
- fcmv1
- 데이터베이스파서
- fcm성능비교
- 클라이언트요청반응
- httpservlet기술
- multipart바인딩
- fcm데이터구조
- 중첩클래스
- DispatcherServlet
- 디스패처서블릿
- 공유기작동방식
- multiparfile데이터
- 프로세스 생성
- biblecash
- rest api
- HTTP프로토콜
- HttpServlet
- 옵티마저
- 동기비동기블로킹논블로킹
- 스프링요청반응
- 동등성동일성
- equals
- 래퍼클래스
- 검증 실패 예외처리
- java enum
- 불변객체
- 옵티마이저
- Wrapper class
- 왜불변객체인가
- rest api 검증
- Today
- Total
개발은 아름다워
[ Java-OOP(1) ] 객체를 쓴다고 객체지향 프로그래밍이 아니다! - 절차지향과 객치향의 차이 본문
객체지향 프로그래밍의 오해
객체지향 프로그래밍의 가장 큰 오해 중 하나는 객체를 쓰면 객체지향 아니야? 라는 것이다.
코드를 짜는 중에 객체를 쓰더라도 절자지향 프로그래밍하고 있을 수 있다.
다음과 같은 요구사항이 있다고 생각해보자.
user의 name을 출력하세요.
public static void main(String[] args) {
// 요구사항 유저의 이름을 출력하세요.
User user = new User("테스트");
String name = user.getName();
System.out.println(name);
}
static class User{
private String name;
public User(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
이렇게 코드를 작성했다면 객체지향프로그래밍을 한 것일까?
아니다.
객체를 쓴다고 OOP가 되는 것이 아니다.
객체 스스로 요구사항에 대한 책임을 다한게 아니기 때문이다.
user.getName() 통해 가져온 name이라는 데이터와
이름을 출력하는 프로세스(행동)이 나누어져 있다.
즉, 데이터와 프로세스가 분리되어 있다는 것이다.
이는 객체 스스로 요구사항에 대한 책임을 다한 것이 아니다.
절차지향과 객체지향의 구분점은 "데이터와 프로세스가 분리되어 있는가?"이다.
바로 데이터와 프로세스(행동)을 결합하여 있는가 아닌가? 로 볼 수 있다.
user 라는 객체는 스스로 자신의 이름을 출력할 수 있어야한다.
즉, 데이터와 프로세스(행동)이 결합되어 있어야한다.
그렇다면 어떻게 데이터와 프로세스를 결합할 수 있을까?
위 코드에서 User 클래스에 printName()이라는 메서드를 추가한다.
public static void main(String[] args) {
// 요구사항 유저의 이름을 출력하세요.
// 절차 지향
User user = new User("테스트");
String name = user.getName();
System.out.println(name);
// 객체 지향
user.printingName();
}
static class User{
private String name;
public User(String name) {
this.name = name;
}
public String getName() {
return name;
}
// printingName을 통해 객체 자신의 이름을 프린트할 수 있음
public void printingName(){
System.out.println(this.name);
}
}
이렇게 생각할 수 도 있다.
user.getNam()을 한거니 객체가 스스로 행동한거니 객체지향 아닌가?
요구사항을 생각해보자.
요구사항은 user의 name을 출력하라는 것이였다.
출력하라 행동까지 객체가 스스로 책임질 때 객체지향프로그래밍이라 할 수 있다.
이번에는 책임 관점에서 생각해보자.
public static void main(String[] args) {
// 요구사항 유저의 이름을 출력하세요.
// 절차 지향
User user = new User("테스트");
String name = user.getName();
//////
///
//
//
// 수천줄이 지나갔다고 가정
System.out.println(name + "수정");
}
위와 같이 String name = user.getName() 이후 수천줄 후에 누군가 System.out.println(name+"수정") 으로 바꾸었다면?
요구사항과 맞지 않게 된다. 왜 달라졌는가? 데이터와 프로세스가 떨어져 있기 때문이다.
user객체가 프린하라까지의 책임을 갖지 않고 있기 때문이다.
하지만 요구사항에 대한 책임을 user객체가 갖게 된다면?
public static void main(String[] args) {
// 요구사항 유저의 이름을 출력하세요.
// 절차 지향
User user = new User("테스트");
//////
///
//
//
// 수천줄이 지나갔다고 가정
user.printingName();
}
수천줄이 떨어져도 요구사항은 user객체가 책임지고 있기 때문에, 늘 같은 값이 출력된다. 혹시 다르게 출력 되었다면 user객체를 생성하는 User클래스에서 printingName()이 변경되었는지만 확인하면 된다.
요구사항에 대한 책임을 객체가 갖게 되므로, 데이터와 프로세스는 결합된다.
혹시라도 유지,보수가 필요하다면 객체를 찾아서 수정하면 된다.
정리
기본이 중요한 것 같다. 이쪽 업계로 발을 들이며, OOP에 대해서 배웠고, 많은 코드들을 작성했었다. 코드들을 돌아보니 정작 객체지향이 아닌 절차지향으로 코드를 작성했던것들 투성이다. 왜냐하면 절차지향과 객체지향의 핵심적인 차이를 체득하지 못했기 때문이다. OOP를 공부하고 배워가고 체득해나가야 한다. 단순히 코드를 짜는게 아니라 시스템 요구사항을 분석하고 요구사항을 처리할 수 있는 객체들을 설계하는 것. 코더가 아닌 아키텍쳐로 성장할 것이다.
'자바' 카테고리의 다른 글
[ Java ] Java는 왜 callbyValue만 되는걸까? (1) | 2024.10.24 |
---|---|
[ Java ] socket을 이용한 실시간 채팅 프로그램을 만들어보자 (ver1) (0) | 2024.10.22 |
[ Spring ] 고대의 서블릿을 찾아서(4) 수문장인 FrontController의 등장 (0) | 2024.10.12 |
[ Java ] 제네릭은 무엇이며 왜 쓰는걸까? (1) | 2024.10.12 |
[ Java ] equals는 왜 쓰는거고 어떻게 쓰는걸까? - 동일성과 동등성 (0) | 2024.10.12 |