2. 클래스 - 첫 번째
Last updated
Last updated
절차지향 : 무엇을 변수로 만들 것인가?
객체지향 : 무엇을 객체로 만들 것인가?
OOP 환경에서 소프트웨어(소스코드) 를 구성하는 단위요소
OOP 프로그램은 객체의 집합체이며 각 객체는 메서드를 통해서 관계를 맺는다.
변수 및 그와 관련한 메서드가 모여진 하나의 집합체
클래스는 반드시 존재 이유와 목적이 명확해야 함
이 객체는 설계의 영역이기 때문에, 사람마다 객체를 나누는 의견이 분분할 수 있다. (정답이 없다)
이런 객체 생성 패턴의 일반화한 것들이 디자인 패턴이라고 볼 수 있다.
Java 에서는 클래스로 객체를 기술한다.
클래스는 변수와 같은 자료형으로 이해
클래스는 객체를 기술하는 문법
클래스 형식에 대해 선언 할 수 있는 것은 참조(null 가능)
인스턴스가 의미하는 것은 추상적인 것에 대한 실체이다.
객체(클래스) 에 대한 실체는 인스턴스이다.
인스턴스는 개발에서 다양한 의미로 사용된다.
변수는 메모리(RAM) 를 사용하고자 하는 문법이다.
다시 말하면 클래스를 인스턴스화 하면 JVM 내에서 할당한 메모리를 사용하게 된다.
관계에 대해 생각하지 않는다면 메서드를 구성요소로 포함하는 단순 집합체로 이해
구성요소(필드나 메서드) 를 멤버라 지칭
필드는 메모리를 사용하는 보편적인 수단
선언과 정의가 공존하는 구조 (일반적으로 다른 언어에서는 선언과 정의를 구분해서 사용한다)
선언 : public void main();
정의 : {// 메서드에 대한 정의}
코드를 작성하는 개발자가 모든것을 기억할 수 있다는 착각에 빠지지 말자
때문에 다음과 같은 기준으로 나누어 코드를 작성하도록 노력해야 한다.
작성자 기준
사용자 기준 (모든 코드는 사용자 기준으로 배려해서 코드를 작성해야 한다)
필드 선언 시 초기값 정의 가능
초기값을 기술하지 않을 시 기본 값은 0
참조 자료형은 null
생성자를 통해 초기화 가능
클래스 내부는 생성자라는 매우 특별한 메서드가 존재한다.
클래스 내 생성자는 다음과 같은 순서로 호출되게 된다.
new
연산자를 통해 특정 클래스 인스턴스를 동적으로 생성
힙영역 메모리 공간 확보 (필드 변수, 메서드 실행 코드)
JVM 에서 생성자를 불러 클래스를 인스턴스화 한다.
생성자는 객체가 생성되는 시점에 자동으로 호출되는 메서드
이름이 클래스 이름과 동일
생략 시 컴파일러가 빈 생성자를 자동으로 추가
반환자료와 호출자가 없는 점에 유의
호출하는 시점이 개발자가 정의하는 것이 아니다. (추측은 할 수 있다)
때문에 값 반환이라는 개념이 없다.
인스턴스를 생성하기 위한 준비가 된 후 JVM 이 호출해준다.
객체의 생성은 new
연산에 따른 동적 생성
다중 정의 가능
클래스 자체와 관련된 코드만 기술할 것!
new
연산자를 이용해 인스턴스 동적 생성
클래스 형식에 대한 변수 선언은 모두 참조 (포인터와 유사)
인스턴스가 존재하지 않는 경우에는 null
한 인스턴스에 대해 여러 참조자가 존재할 수 있음
사이드 이펙트 문제 고려
위 예제에서 MyFirstClass
타입의 변수인 myClass
는 포인터로 생각하면 된다. 때문에, 알수없는 레퍼런스 값을 할당 받는다.
클래스 변수 : 레퍼런스 할당
일반 변수 : 값 할당
클래스로 구현한 객체 자신의 인스턴스에 대한 참조자
클래스에 대한 인스턴스 선언(미래) 시 값(주소)이 결정될 수 있음
인스턴스가 힙메모리에 JVM 생성하는 시점(런타임)에 값이 결정된다.
같은 클래스에 대한 인스턴스라고 하더라도 this 값은 각자 다른 값이 된다.
메서드 호출시 스택(0번 슬롯) 에 값이 저장
정적 메서드에서는 사용할 수 없다.
인스턴스가 생성되지 않았는데, 주소값을 사용한다?
말이 안된다.