비가 올 듯 말 듯 기상청도 어지러워 하는 날이다
객체지향
주변의 많은 것들을 객체화 해서 프로그래밍
객체지향 프로그래밍
특징
- 추상화 : 현실의 객체를 추상화 해서 클래스를 구성
- 다형성 : 하나의 객체를 여러 가지의 타입으로 참조
- 상속 : 부모 클래스를 물려 받으면서 그 자식이 부모의 메소드를 재정의하면서 사용
- 데이터 은닉 및 보호 : 데이터를 외부에 노출시키지 않고 메서드를 이용해 보호
객체지향 프로그래밍의 장점
- 신뢰성이 높음
- 추가/수정/삭제가 요잉
- 재사용성이 높음
현실과 OOP의 관계
- 현실 객체가 갖는 속성과 기능은 추상화되어 클래스에 정의
- 클래스는 구체화 되어 프로그램의 객체가 됨.
- 설계도는 하나의 Type이 되고 이를 통해 나온 제품을 객체라 부르며 그 주체가 사용함.
- 설계도 == Class, 객체 ==
new Class()
를 통해 나온 인스턴스프로그램의 클래스와 객체
클래스
- 객체를 정의해 놓은 것. == 객체의 설계도
- 클래스는 직접 사용 X.
객체(instance, object)
- 클래스를 데이터 타입으로 메모리에 생성되어 실제로 동작하는 것
예시
🔺왼쪽은 클래스, 오른쪽은 클래스를 객체로 구체화 한 것JVM 메모리 구조
meta-space
- 클래스 정보를 처리
- 타입 정보
- Field 정보
- Method 정보
stack
- 메서드들의 실행 공간
- thread 별로 별도 관리
- 메서드 호출 시 마다 메서드 프레임 적층
- 메서드 프레임에 로컬변수도 쌓이는 구조
heap
- 객체를 저장하기 위한 영역
- thread에 의한 공유
- 객체가 생성되고 G.C에 의해 처리
- 상수 풀
변수
인스턴스 멤버 변수
- 선언 위치 : 클래스 {}에 선언
public class Person{ String name; int age; }
- 변수가 생성될 때 heap에 객체 별로 생성
- 타입 별로 default 값으로 초기화 됨
- 접근 방법 : 인스턴스로 생성 후, 그 객체로 접근
- 소멸 시점 : G.C에 의해 객체가 없어질 때
클래스 멤버 변수
- 선언 위치 : 클래스 {}안에
static
키워드를 붙여 선언public class Person { static String scientificName = "Homo Sapiens"; String name; }
- 클래스 로더에 의해 클래스가 로딩될 때 heap에 클래스 별로 생성
- 개별 객체의 생성과 무관하며 모든 객체가 공유(== 공유변수)
- 객체 생성과 무관하게 클래스 이름으로 접근
Person p = new Person(); p.scientificName = "객체로 변경"; // static에 부합한 표현 Person.scientificName = "클래스로 변경"; // 👍
- 소멸 시점 : 클래스가 언로드 될 때 G.C 발생
지역 변수 & 파라미터 변수
- 변수 생성 : stack의 메서드 프레임 내부의 영역에 적재
메서드
⚠기본형 변수와 참조형 변수⚠
- 메서드 호출 시 파라미터로 입력된 값을 복사해서 전달
- Java는 call by value
- 5
- 5 : change1 메서드에 cbt.memberVar의 값인 5를 복사 하여 넣었기 때문에
- 105 : cbt가 가리키는 주소 값을 복사 -> 그 주소 값이 가리키는 memberVar의 값을 변경
생성자
기본 생성자
- 파라미터가 없고 구현부가 비어있는 형태
- 또한, 생성자 코드가 없으면 컴파일러가 자동으로 제공
파라미터가 있는 생성자
- 일반 멤버 변수의 초기화를 목적으로 파라미터에 값을 넣는 생성자
- ⚠ 단, 파라미터가 있는 생성자를 만들면 컴파일러가 기본 생성자를 자동으로 제공하지 않음. 즉, 기본 생성자가 필요하다면 직접 만들어야 함.
this.
- 참조 변수로써 객체 자신을 가리킴. 자신의 멤버 변수에 접근
- 객체에 대한 참조 (-> static 영역에는 접근 X)
this()
- 생성자를 오버로딩할 때 사용.
- 한 생성자에서 다른 생성자 를 호출할 때 사용
- 첫 줄에만
this()
사용. (단, 최신 Java 버전에는 다른 줄에도 사용 가능)
날치알밥.
비빔밥 아님.
왼쪽 위 어묵.
소세지 아님.
종류 | 선언위치 | 변수 종류 | 메모리 영역 | 적재 시점 | 초기화 | 소멸 시점 |
---|---|---|---|---|---|---|
멤버 변수 | 클래스 영역 ( static keyword ) | 클래스 멤버 변수 | meta-space | 클래스 로더에 의해 클래스가 로딩 될 때 | 타입 별 default | 클래스가 unload 될 때 소멸 |
클래스 영역 | 인스턴스 멤버 변수 | heap | 객체가 만들어질 때 | 타입 별 default | G.C에 의해 객체가 없어질 때 | |
지역 변수 | 함수 내부 | 지역 변수 | stack | 선언된 라인이 실행될 때 | 명시적 초기화 필요 | 선언된 영역에 벗어날 때 |
파라미터 변수 | 지역 변수 | stack | 선언된 라인이 실행될 때 | 명시적 초기화 필요 | 선언된 영역에 벗어날 때 |
자바를 배우고 다루는 사람이라면 필수로 알아야 하는 부분을 배운 느낌이다.
자바를 꽤 많이 그리고 자주 썼다고 생각했지만, 내가 놓치고 몰랐던 부분이 많아 놀라웠다.
특히, CS 면접 준비할 때보다 더 깊은 부분은 공부한 것 같아 뿌듯한 기분도 든다.
싸피 굿