클래스란?
Class (classification)
필요한 기능을 조합해서 '하나'로 묶고 이름을 붙여서 언제든 다시 불러와 편하게 사용할 수 있도록 만드는 기능
어떤 공통된 특징에 따라 분류하여 만든다.
작게 구분하는 단위인 클래스를 사용하여 코딩하는 것이 바로 객체지향형 프로그래밍 이다.
클래스 만들기
클래스를 만들 땐 클래스 이름과 파일 이름이 같아야한다
참치 종류: 일반/야채/고추
참치 01호, 참치 02호, 참치 03호 등 참치선물세트에 들어가는 참치 종류의 개수가 다름class 참치선물세트 { int 일반; int 야채; int 고추; }
인스턴스란?
클래스를 사용하여 선물세트인 참치 01, 02, 03 호를 만들 수 있는데 이 세트 각각을 인스턴스 (intance) 라고 부른다.
인스턴스는 만들 때 값을 변경해서 그때그때 다른 값을 가지게 할 수 있다.
인스턴스 만들기
참치선물세트 참치01호 = new 참치선물세트(); . 참치01호.일반 = 20; 참치01호.야채 = 0; 참치01호.고추 = 0;
참치선물세트 참치03호 = new 참치선물세트(); . 참치03호.일반 = 12; 참치03호.야채 = 3; 참치03호.고추 = 3;
클래스를 선언하는 파일과 그 클래스를 사용한 인스턴스를 선언하는 파일이 다르다.
생성자란?
클래스와 인스턴스 이름을 매번 쓰는 게 상당히 번거롭다. 그래서 이 반복되는 과정을 최대한 짧게 표현하는 방법으로 고안된 것이 바로 생성자 (Constructor)이다.참치선물세트 참치03호 = new 참치선물세트(); 참치03호.일반 = 12; 참치03호.야채 = 3; 참치03호.고추 = 3;
⇩
참치선물세트 참치03호 = new 참치선물세트(12, 3, 3);
이렇게 인스턴스를 선언하고 값을 바로 넣음으로써 코드 4줄을 1줄로 표현 할 수 있다.
그런데 이때, 괄호 안의 첫 번째 값이 일반참치, 두 번째 값이 야채참치, 세 번째 값이 고추참치의 값이라는 것을 컴퓨터가 어떻게 알 수 있을까? 당연히 모른다! 그래서, 각각의 값이 어느 변수에 저장되어야 하는지 알려주어야 하는데 이 역할을 하는 것이 바로 생성자다.
생성자 만들기 / 단축키 cmd+n
- 참치선물세트.java
class 참치선물세트 { int 일반; int 야채; int 고추; . 참치선물세트(int x, int y, int z){ //여기서부터 생성자!!! 일반 = x; 야채 = y; 고추 = z; } }
- 메인.java
생성자 추가 전참치선물세트 참치03호 = new 참치선물세트(); . 참치03호.일반 = 12; 참치03호.야채 = 3; 참치03호.고추 = 3;
생성자 추가 후 ⇩
참치선물세트 참치03호 = new 참치선물세트(12, 3, 3);
생성자 덕분에 인스턴스 선언이 간단해졌다.
생성자는,
- 필요에 따라 클래스당 하나 이상을 만들 수 있다.
예) 참치01호는 야채참치, 고추참치가 없는 참치선물세트다. int는 기본값이 0
- 참치선물세트.java
class 참치선물세트 { int 일반; int 야채; int 고추; . 참치선물세트(int x, int y, int z){ //생성자#1 - 참치03호에 대한 생성자 일반 = x; 야채 = y; 고추 = z; } . 참치선물세트(int x){ //생성자 #2 - 참치01호에 대한 생성자 일반 = x; 야채 = 0; 고추 = 0; } }
- 메인.java
참치선물세트 참치03호 = new 참치선물세트(12, 3, 3); 참치선물세트 참치01호 = new 참치선물세트(20);
- method와 같이 생성자의 이름을 말하고, 외부에서 변수를 입력받고 그 안에서 무언가 행동이 일어 난다.
그러나, method와 다른점은
- 이름을 클래스 이름과 동일하게 지어야 한다.
- 이름 앞에 return 값의 변수형이나 void를 입력하지 않는다.
초기화
클래스의 인스턴스를 처음 생성할 때, 각 메모리 그릇을 만들어주고 동시에 값을 넣는 작업을 초기화라고 한다.
그래서OOO 클래스를 초기화 한다
는 말은,OOO 클래스 형태로 된 인스턴스 메모리 그릇 묶음을 만들고, 각 메모리 그릇에 초깃값을 넣어준다
라는 의미이다.
클래스 이름과 인스턴스 이름, 어떻게 구분?
- 클래스 이름 첫 글자는 대문자로
- 인스턴스 이름 첫 글자는 소문자로!