자바는 객체지향 프로그래밍 언어이다. 객체지향 프로그래밍 언어에서는 프로그램을 객체 단위로 실행한다.
클래스란 이 객체를 만들기 위한 틀이라고 생각하면 된다.
붕어빵 기계(클래스)로 붕어빵(객체)을 찍어낸다는 개념이다.
클래스는 다양한 자료형의 데이터를 하나로 묶고 이 데이터를 처리하는 기능을 추가하여 다양한 자료형의 데이터를 관리하고 처리할 수 있는 기능을 갖춘 문법 요소이다.
클래스의 내부 구성 요소로는
- 필드: 클래스의 특징을 나타내는 변수 ( Ex. int radius =10;)
- 메서드: 클래스가 지니고 있는 기능(함수)
- 생성자: 클래스의 객체를 만드는 역할을 담당한다. 생성자는 반드시 클래스의 이름과 동일하여야 한다.
- 이너 클래스: 클래스 내부의 클래스
우리는 클래스를 직접적으로 사용할 수 없고 클래스를 이용하여 객체를 생성하고
객체속의 필드와 메서드를 사용해야 한다.
클래스의 생성자로 객체를 만드는 과정을 '인스턴스화'라고 하며 그렇게 만들어진 객체를 '인스턴스' 라고 한다.
클래스는 다음과 같이 정의한다.
접근지정자(생략시 default) class 클래스명{
...
}
객체는 new 키워드를 사용하여 생성한다.
클래스명 참조 변수명 = new 생성자();
Ex)
Circle cir = new Circle();
객체는 생성자를 통해 만든다고 하였고 new 키워드는 '~을 힙 메모리에 넣어라' 라는 의미이다.
즉, 위의 예시에서는 'Circle( ) 생성자로 만든 객체를 힙 메모리에 넣고
Circle 타입의 참조변수 cir에 주소값을 넣어라' 라는 의미이다.
클래스 Circle은 클래스 영역에 들어가고 참조변수는 스택영역에 들어가며 객체의 주솟값이 저장 될 것이다. 생성자로 만들어진 객체는 힙 메모리에 들어가며,
객체 내부에는 멤버(필드,메서드,이너 클래스)가 위치 할 것이다.
객체는 힙 메모리에 생성이 되지만 개발자는 힙 메모리에 직접 접근할 수 있는 방법이 없다. 따라서 주소값을 저장하고 있는 참조 변수를 이용하여 객체에
접근해야 한다.
이때 사용하는 것이 포인트 연산자( . )이다.
참조 변수명.필드명;
참조 변수명.메서드명();
Circle cir = new Circle();
System.out.println(cir.radius); //참조 변수명.필드명
cir.getArea(5); //참조 변수명.메서드명()

클래스 내부 구성요소 4가지(필드,메서드,생성자,이너클래스)중
필드,메서드,생성자에 대해 알아보자.
1) 필드
필드는 클래스에 포함된 변수이다.
지역 변수와는 다른 개념으로 지역 변수는 메서드 내부에 포함된 변수이다.
지역 변수는 스택 메모리에 생성되며 필드는 힙 메모리의 객체 내부에 생성된다.
힙 메모리에는 빈 공간이 저장될 수 없기에 필드는 초기화를 시키지 않아도 자동으로 초기화가 된다.
(boolean은 false / 정수형은 0 / 실수형은 0.0 / 이외의 참조 자료형은 null)
2) 메서드
접근 지정자 리턴 타입 메서드명(입력매개변수){
메서드 내용
}
Ex)
public int sum(int a,int b){
return a+b;
}
리턴 타입은 메서드 종료 후 반환 되는 값의 자료형을 의미하며
입력매개변수는 메서드에 전달되는 값이다.
반환 타입으로는 void,int,double,boolean등이 있으며
void는 반환 타입이 없다는 의미로 반환타입이 void인 메서드 내부의
return은 메서드를 종료하라는 의미이다.
클래스 외부에서 메서드를 호출할때는 객체를 만들어서 호출해야하지만
같은 클래스 내부에 있는 메서드끼리는 객체를 만들지 않고 호출할 수 있다.
메서드 시그니처란 메서드명과 입력매개변수의 자료형을 의미한다.
JVM은 메서드 시그니처가 다르면 메서드명이 동일해도 다른 메서드로 인식한다.
이를 이용하여 입력매개변수의 자료형혹은 개수가 다른 여러 개의 이름이 동일한 메서드를 같은 클래스에 정의할 수 있다.

3) 생성자
생성자는 객체를 생성하는 역할을 담당한다.
반드시 클래스명과 동일하여야 한다.
리턴 타입이 없다.
클래스명(입력매개변수){
...
}
생성자를 만들지 않으면 컴파일러가 기본 생성자를 자동으로 추가한다.
기본 생성자란 매개변수가 없는 생성자를 의미한다.
생성자는 입력매개변수에 따라 객체를 생성하는 방법이 달라진다.

1) this 키워드
클래스 내부에서는 객체의 생성없이 같은 클래스의 필드와 메서드를 바로 사용할 수 있다.
이렇게 객체없이 클래스 내부에서 필드 혹은 메서드를 사용할때 내부 객체 참조 변수명인 this키워드가 사용된다.
this키워드를 생략하면 컴파일러가 자동으로 추가해준다.
class Circle{
int radius;
void setRadius(int a){
this.radius = a; (this생략시 컴파일러가 자동으로 추가)
}
}
컴파일러가 this키워드를 자동으로 추가해준다니 굳이 우리가 작성할 필요가 없다고 느낄 수 있지만 다음과 같이 지역 변수나 생성자의 입력매개변수가
필드명과 동일한 경우에는 반드시 명시적으로 this키워드를 작성해줘야 한다.

위의 예시에서 this키워드가 붙은 radius는 당연히 필드가 될것이다.
2) this( ) 메서드
this( ) 메서드는 자신이 속한 클래스 내부의 생성자를 호출하는 명령어다.
this( ) 메서드는 다음 두가지의 규칙이 있다.

Do it! 자바 완전 정복