코드스테이츠 - 3회차 백엔드 부트캠프/Section 1
2022.09.02 금 - 클래스와 객체
곰돌이볼
2022. 9. 2. 09:11
📄 학습내용
객체지향프로그래밍(OOP)
- 객체지향프로그래밍(OOP, Object Oriented Programming)
- 필요한 데이터를 추상화시켜 이를 사용하기 위해서 객체를 생성하고, 이렇게 생성한 객체들끼리 상호작용을 해서 원하는 기능을 구현하고자 하는 프로그래밍 방법론
- 클래스
- 객체를 구현하기 위한 틀
- 객체
- 클래스를 이용해서 생성한 실제하는 것이자 사용할 수 있는 실체
- 클래스와 객체의 차이점은?
- 클래스를 구현하기 위한 추상화된 틀이고, 객체를 클래스를 이용해서 실제로 존재하는 실체
클래스
- 인스턴스 & 인스턴스화
- 인스턴스 : 클래스를 이용해 생성한 객체
- 인스턴스화 : 클래스로부터 객체를 생성하는 과정
- 객체와 인스턴스의 차이점
- 객체는 인스턴스를 포함하고 있는 넓은 개념
- 인스턴스는 어떤 클래스로부터 생성된 객체라는 것을 강조하는 개념
- 구성요소
- 필드 : 속성을 나타내는 변수들을 선언하는 구간
- 메서드 : 기능을 나타내는 함수를 선언하는 구간
- 생성자 : 객체를 생성하는 역할
- 이너 클래스 : 클래스 내부에 선언된 클래스
- 기본 문법
// 클래스 정의
class 클래스명 {
// 필드
// 메서드
// 생성자
// 이너 클래스
}
// 클래스 선언
클래스명 객체명;
// 클래스의 객체 생성
객체명 = new 생성자();
// 클래스 선언 및 객체 생성
클래스명 객체명 = new 생성자();
객체
- 구성요소
- 속성 : 클래스의 필드에 정의되어 있음
- 기능 : 클래스의 메서드에 정의되어 있음
- 객체의 멤버
- 객체의 속성(클래스의 필드) → 멤버 필드, 멤버 변수
- 객체의 기능(클래스의 메서드) → 멤버 메서드
- 이너 클래스(클래스 내에 선언된 클래스) → 멤버 내부 클래스
- new 키워드
- 실제 객체를 생성하기 위한 키워드
- 사용방법 : 클래스명 객체명(인스턴스명) = new 생성자();
- 포인트 연산자(.)
- 객체를 생성한 후에 멤버에 접근가능하게 하는 연산자
- 사용방법 : 객체명.멤버
- 객체 생성 시 메모리 저장되는 과정
- 클래스(static) 영역 :
- 클래스 → 클래스가 정의된 부분(클래스 변수 포함)
- 인스턴스 메서드 영역 → 인스턴스의 메서드가 저장된 부분(이유 : 같은 클래스로 선언된 객체들은 같은 메서드를 공유하기 때문에 여러 번 객체가 선언되어도 메서드는 클래스 영역에 한 번만 선언된다.)
- 스택(stack) 영역 : 참조변수(객체명) → 힙에 생성된 객체의 주소값
- 힙(heap) 영역 : 생성자로 생성된 객체 → 객체의 멤버(필드, 메서드, 이너 클래스), 인스턴스 변수 포함
- 클래스(static) 영역 :
정적 멤버
- 정적 멤버란?
- static이 선언된 멤버
- 인스턴스 선언 없이 사용가능, 인스터스(객체)에서도 사용가능
- static 키워드
- 모든 객체와 메모리를 공유하기 위해서 사용하는 키워드
- 정적 멤버 종류
- 정적 필드 : 객체들 간의 공유 변수
- 정적 메서드 : 인스턴스 변수는 사용 불가능하고, 클래스 변수만 사용 가능
- 정적 이너 클래스
필드
- 필드란?
- 클래스 내에 객체의 속성이 선언된 변수
- 자바의 클래스 변수
- 클래스 변수(cv, class variable, 정적 변수) : static이 선언된 변수
- 인스턴스 변수(iv, intance variable) : static이 선언되지 않은 변수
- 지역 변수(lv, local variable) : 메서드 내에 선언된 변수
- 변수가 저장되는 위치
- 인스턴스 변수 : 객체가 선언될 때 힙 영역에 선언되어서 객체들끼리의 고유성을 가짐
- 클래스 변수 : 인스턴스끼리 공통된 저장공간을 같은 변수이므로 클래스 영역에 선언되며, 인스턴스를 생성하지 않아도 사용 가능, 사용방법 : 클래스명.클래스_변수
- 지역 변수 : 스택 영역에 선언되며, 메서드가 종료되면 지역 변수도 소멸됨
- 필드 변수 & 지역 변수 초기화
- 필드 변수(인스턴스 변수, 클래스 변수)는 heap 영역에 저장되고, 객체가 소멸되지 않는 한 삭제되지 않고 초기화하지 않아도 자동으로 초기화를 해줌
- 지역 변수는 stack 영역에 저장되고, 오랫동안 사용되지 않으면 가상 머신이 자동으로 삭제하고 자동으로 초기화해주지 않기 때문에 초기화가 필수로 이루어져야함
메서드
- 메서드란?
- 일정한 기능을 수행하는 명령어들의 집합
- 구성요소
- 메서드 시그니처 : 제어자, 반환타입, 메서드명, 매개변수(생략 가능)으로 구성됨
- 메서드 바디 : 메서드 내용과 반환값(return)으로 구성됨, static 선언 X
- 메서드 선언
제어자 반환타입 메서드명(매개변수) // 메서드 시그니처
// 메서드 바디
메서드 내용
return 반환타입 // 반환타입이 void가 아닌 경우
}
- 메서드 호출
- 클래스 내부의 메서드끼리는 객체 선언없이 서로 호출 가능
// 클래스 외부
객체명.메서드명(인수); // 인스턴스 메서드, 인수는 매개변수가 있을 경우에만 선언
클래스명.메서드명(인수); // 정적 메서드, 인수는 매개변수가 있을 경우에만 선언
// 클래스 내부
메서드명(인수);
- 메서드 오버로딩
- 클래스 내에 이름이 같은 메서드를 2개 이상으로 선언하는 것
- 성립 조건
- 1) 같은 클래스 내에 메서드의 이름이 같아야 함
- 2) 메서드의 매개변수의 개수 또는 타입이 달라야 함
⭐ 공부 난이도
클래스와 객체 ☆☆☆★★
클래스와 객체의 차이를 아는가?
클래스의 구조를 설명하고, 그 구조에 대해서 알고 있는가?
static 키워드가 무엇이고 어떻게 메모리에 저장되고 동작되는지 아는가?
🌕 느낀점
클래스의 구조가 무엇이고 안의 내용이 어떻게 동작하는지 알게 되었다. 예전에도 자바 클래스의 구조를 공부했던 적이 있었는데, 이번 공부를 통해서 개념을 명확하게 이해할 수 있었다. 클래스가 메모리에 어떻게 저장되고 동작되는지를 이해하니 static이나 클래스의 동작 원리가 더 쉽게 이해되었다. 오늘 블로깅 세션을 통해서 "내가 알고 있는 것이 정말 알고 있는가?"에 대해서 생각해보았다. 그래서 블로깅을 할 때, 개념을 정확하게 확인하기 위해서 계속 생각하고 생각해서 생각보다 쉽지 않았다. 이게 맞는 공부법인지도 솔직히 잘 모르겠지만 꾸준히 해보다보면 알게 될 것 같다.