스프링을 들어가기전 자바의 객체와 클래스에 대한 이해가 부족하다고 느껴서 이해도를 높이기 위해 이에 관한 정리를 진행
객체 지향 프로그래밍은 우리의 현실세계와 밀접한 관련이 있으며, 현실세계를 기반으로 모델링하여 컴퓨터 프로그램으로 나타내는 것이다.
현실세계의 모든 것들은 객체로 표현할수가 있고 각각 서로 다른 객체는 유기적으로 상호작용을 한다.
예를 들어서 담배라는 객체는 라이터라는 객체로 불을 피우고, 인간이라는 객체가 그 담배를 피운다.
이것이 일련의 프로그램이 동작하는 과정인것이다.
객체 기반 프로그래밍은 클래스를 기반으로 구현 되어 있으며, 여기에서 클래스는 만들어질 객체가 가질 속성과 기능을 담고 있다.(설계도).
예를 들어서 인간이라는 객체가 클래스를 기반으로 만들어졌다면,
키, 눈동자의 색, 코의 높이, 성격, 혈액형 등은 인간의 속성
이고,
달리기, 숨쉬기, 팔의 움직임, 식사, 배변활동 등은 인간이라는 객체의 기능
이다.
클래스는 자료형이다
클래스는 객체를 정의해놓은 것이다.(객체가 가지는 속성과 기능을 정의)
객체와 클래스는 다르다
객체는 클래스를 바탕으로 메모리에 만들어진 실체이다
클래스가 설계도라면 객체는 완성품이다.(자동차의 설계도와 생산된 자동차의 관계)
public class의 이름은 파일의 이름과 동일하다.
하나의 파일에 하나의 클래스를 정의하는 것을 권장
객체 지향 프로그래밍은 객체들의 상호작용으로 동작한다.
클래스에는 객체가 가져야할 속성과 기능이 정의되어 있다
여기서 말하는 속성은 필드(변수), 기능은 메서드(함수)이다.
객체가 만들어지기 위해서는 설계도(class)가 필요할 것이고, 그 설계도에는 속성(변수)와 기능(메서드)을 담고 있을 것이다.
예로
TV의 음량, 화면밝기, 채널, 전원, 크기, 디자인, 브랜드명 등은 TV의 속성일 것이고,
TV의 전원 끄기 켜기 기능, 채널 이동기능, 음량조절기능, 밝기조절기능 등은 TV가 갖고있는 기능일 것이다.
이 설계도를 기반으로 만들어진 완성품 TV는 객체이고, 한장의 설계도가 있으면 TV를 여러대 생산할 수 있다(객체 생성)
클래스는 class 키워드를 통해 정의할 수 있으며, 클래스의 이름은 대문자로 시작하는 것이 관례이다.
public class ClassName { // 클래스
int studentNumber = 10; // #1 필드
public int MethodName{ // #2 메서드
}
ClassName { // #3 생성자
}
class ClassName2 { // #4 inner 클래스
}
}
클래스의 속성(변수)을 나타낸다. 객체의 데이터, 상태 정보 등을 저장하는 곳이다.
메서드와 생성자 전체에서 사용할 수 있다.
클래스의 행위(메서드)를 나타낸다. 객체 간의 데이터 전달 수단으로 활용된다.
외부로부터 값을 받을 수 있으며, 메서드의 실행 이후 값을 반환할 수 있다.
클래스의 객체를 생성하고 초기화하는 역할을 한다.
new 연산자를 통해 호출되며 반환 타입은 없다.
객체의 생성은 new 키워드를 통해 생성이 가능하다.
생성된 객체는 포인트 연산자(.)를 통해 해당 객체의 멤버에 접근이 가능하다.
이렇게 생성된 객체들은 인스턴스라 하며, 인스턴스는 여러 개 생성될 수 있다.
클래스이름 참조변수이름 = new 생성자(); // 객체의 생성, 생성된 객체는 인스턴스
class CarInstanceCreate {
public static void main(String args) {
Car tesla1 = new Car(); // Car 클래스를 기반으로 생성된 tesla1 인스턴스
Car tesla2 = new Car(); // Car 클래스를 기반으로 생성된 tesla2 인스턴스
Car benz1 = new Car(); // Car 클래스를 기반으로 생성된 benz1 인스턴스
Car benz2 = new Car(); // Car 클래스를 기반으로 생성된 benz2 인스턴스
Car genesis1 = new Car(); // Car 클래스를 기반으로 생성된 genesis1 인스턴스
Car genesis2 = new Car(); // Car 클래스를 기반으로 생성된 genesis2 인스턴스
}
}
객체는 만들어지면 Heap이라는 메모리 영역에 생성이 되고
소문자로 이루어진 변수는 stack에 생성이 된다
소문자로 이루어진 변수는 만들어진 객체에 값을 직접 갖고있는 것이 아닌 Heap에 있는 객체를 참조하는 값을 갖고있다.
그림예시)
이렇게 생성된 소문자 변수는 객체를 참조하며 .(도트연산자)로 각 멤버에 접근할수 있다.
객체를 생성하면 클래스에서 정의한 필드와 메소드가 사용이 가능해진다.