일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 스프링배치 5
- 자바21
- 알고리즘
- 스프링 핵심 원리 - 고급
- 글또9기
- 카프카강의
- 글또 OT 후기
- 제네릭
- 오프라인밋업
- SSAFY
- 유데미
- 자바17
- 글또10기
- 글또 다짐
- 코딩테스트
- BOJ
- 코드트리
- 검색도메인
- 글또
- 자바
- 글쓰는또라이
- Git
- 검색 도메인
- 백준
- 글또OT
- 코드트리x글또
- 배치
- 개발자
- 글또후기
- 검색개발
- Today
- Total
영주의 개발노트
클래스와 객체 본문
신입 개발자 교육과정을 듣기 전,
기본 지식 정도를 헤아리기 위해 몇몇의 질문이 적힌 설문지를 받았다.
가장 첫 질문이 '클래스와 객체의 차이에 대해 설명하라.'였다.
보고 띠용👀했다.
나... 모르네? 😅
'이것도 모르는데 객체지향 언어인 자바를 사용한다고 할 수 있나?' 자괴감이 들었다.
자괴감이 든 것도 잠시 계속 해당 질문에 대한 답을 찾으려고 하지 않았다.
이후 코드 리뷰, 스터디 등에서 계속해서 해당 용어에 대한 코멘트와 개념을 가지고 이해해야 하는 내용들이 많이 등장했기에... 이제야 정리해보고자 한다.
이번 기회를 통해 쉽게 휩쓸리는 모래성을 쌓는 것이 아닌,
견고하게 콘크리트성을 쌓아보고자 한다 🏰
💡 🗣 "너! 클래스와 객체 설명해봐!" 하면 설명할 수 있는 내가 되길 바라며 🙏
- Effective Java 3/E item 1. 생성자 대신 정적 팩터리 메서드를 고려하라
클라이언트가 클래스의 인스턴스를 얻는 전통적인 수단은 public 생성자다.
이런 말들이 확 와닿지 않았다.
간단하게 말해서,
클래스(Class) 는 추상 (abstraction), 오브젝트(객체, Object)는 실체(instance)❗️
잠깐, 추상이 뭔데?
抽 : 뽑을 추
象 : 코끼리 상 🐘...?
➡️ 꼴, 모양, 형상
∴ 대상으로부터, 모양을 뽑아내는 것
즉, 사용자가 구체적인 내용을 생각하지 않고도 사용할 수 있는 기술
1. 클래스는 표현 대상의 특징에 대한 서술(= abstraction, 추상) 을 말한다.
클래스는 표현 대상들의 공통적인 특징을 서술한 것이다.
2. 오브젝트는 클래스의 인스턴스이다.
오브젝트는 클래스가 실체로 만들어진 것
- attribute = data = member variables = state = field
- behavior = operation = member function = method
- 클래스 = 개념 = 타입
- 객체 = 실체 = 변수
오브젝트는 데이터와 데이터에 대한 조작들을 묶은 것이다.
오브젝트의 모양은 클래스에 서술되어 있다.
💡 Object = data + operation on data + Identity
클래스를 오브젝트의 템플릿이라고도 부른다.
이러한 용어에 대해 강경보수파인 Yegor Bugayenko 씨의 말을 빌리면,
이런 류의 설명은 단순히 필요한 시점에
어딘가에서 복사되는 수동적이고 멍청한 코드 덩어리로 클래스를 격하
라고 표현한다. 또한, "객체를 살아있는 생명체로 표현한다면 클래스는 객체의 어머니라고 할 수 있다." 고 하였다.
이 사람은 굉장히 클래스를 중요하게 생각하는 듯했다. 클래스를 객체의 능동적인 관리자로 생각해야 하며, 클래스는 객체를 꺼내거나 반환할 수 있는 위치라고 설명했다.
위 저자의 말을 엮은 조영호 씨가 작성한 객체지향의 사실과 오해에서는 다음과 같이 클래스를 표현하고 있다.
지나치게 클래스를 강조하는 프로그래밍 언어적인 관점은 객체의 캡슐화를 저해하고 클래스를 서로 강하게 결합시킨다. 이로 인해 유연하고 확장 가능한 애플리케이션의 구축을 방해한다고 말했다. 또한, 클래스는 객체들의 협력 관계를 코드로 옮기는 도구에 불과하다고 하였다.
앞서 말한 어머니의 위상이 심하게 떨어졌다.
나는 현재 어떤 것이 맞다고 할 수 없다. (당연함. 내가 뭐라고🤣) 내 의견이 어느 곳에 더욱 치우쳐있는지도 말할 수 없다. 이는 더 공부를 해봐야 나만의 견해가 생길 것이라고 생각한다.
내 단순한 생각으로는 ✌️객체✌️지향 프로그래밍이니... 객체 간의 관계가 더 중요하지 않을까?라고 생각하고 있긴 하다.
각설하고,
클래스는 공통의 개념을 의미하여 클래스 자체만으로는 상태가 없다.
객체는 클래스를 통해 구체화되고, 상태를 갖는다. 또한, 다양한 메서드를 통해 상태를 변경할 수 있다.
이렇게 정리할 수 있을 것 같다.
인스턴스 메서드, 필드
- 인스턴스 메서드 : 인스턴스의 상태를 변경하거나 상태 정보를 반환할 때 사용하는 메서드. 인스턴스를 생성한 후 메시지를 보낼(=메소드 호출) 수 있다.
- 인스턴스 필드 : 인스턴스의 상태 정보를 가지고 있는 변수. 상태 변수라고도 한다.
클래스 메서드, 필드 (static)
- 클래스 메서드 : 인스턴스의 상태와는 관련이 ❌ 인스턴스를 생성하지 않은 상태에서도 호출이 가능하다. 클래스 메소드는 유틸리티 메소드라고도 칭한다.
- 클래스 필드 : 여러 인스턴스에서 공유하는 정보가 있는 경우 사용한다.
- Count가 상태를 갖고 있다.
Count 내부에 상태 변수를 갖고 있다. - 클라이언트가 클래스의 인스턴스를 얻는 전통적인 수단은 public 생성자다.
클래스의 인스턴스 = 객체
정리해보자면,
클래스로부터 객체가 생성된다는 것을 알 수 있다.
클래스는 특징을 갖고 있는 애라고 할 수 있다.
예를 들어, 사람 정보를 나타내려면 이름, 성별, 나이 등이 필요하다. 이렇게 구분할 수 있는 큰 범위의 특성들을 갖고 있는 사람 집합을 클래스라고 한다.
객체는 사람이라는 큰 덩어리가 있을 때, '이름은 0JUUU, 성별은 여자, 나이는 10세' 이런 식으로 구체적인 상태를 갖고 있는 것을 말한다.
두서없이 작성한 글이다. 차차 보완해나가야 한다. 현재는 맞다고 생각한 개념이 틀릴 수도 있다.
또한, 클래스에 대해 조영호님과 부가옌코...? 님의 견해가 살짝 다른 것처럼 정답은 없다고 생각한다.
다른 사람들의 생각은 어떠한지도 궁금하다. 이곳저곳 물어봐야겠다.
참고