소스파일의 이름은 파일 내 클래스명 중 하나와 일치해야하지만
public 클래스가 있는 경우에는 해당 클래스와 소스파일의 이름이 반드시 일치해야함
main 메소드는 소스파일의 이름과 일치하는 클래스에 만들어야 실행 됨
//클래스 선언
class 클래스명(첫글자는 대문자) { 내용 }
class Car {
String name; // 인스턴스 변수
static int tier = 4; // 클래스 변수
void print_car() {
String color = "red"; // 지역 변수
System.out.println(color);
}
}
//클래스 사용
Car human = new Car();
human.print_car();
int x = Car.tier; // 클래스 변수 사용
//메소드
접근제어자 반환타입 메소드명(매개변수) {
메소드 내용;
return 값; // 반환타입이 void가 아니라 존재한다면 값을 무조건 리턴 해줘야 함
}
//메소드 사용
메소드명();
//생성자
class People {
String name;
String sex;
int age;
// 생성자 선언
People() {
this(String name, String sex, int age); // this()
}
People(String name, String sex, int age) { // 생성자 오버로딩
this.name = name;
this.sex = sex;
this.age = age;
System.out.println("이름은" + name + "이고, 성별은 " + sex + "이며, 나이는 " + age + "입니다");
}
}
//생성자 사용
People human = new People();
클래스의 필드의 구성요소
멤버
변수, 메소드, 생성자
변수
인스턴스의 속성 정의
인스턴스 변수 : 클래스 내에서는 호출이 자유롭지만 클래스 외부에서는 객체를 생성하여 호출해야 함
클래스 변수 : static을 통해 정적멤버로 만들어진 클래스 변수는 클래스 외부에서도 클래스명.변수명을 통해 호출 가능
지역 변수 : 클래스 내의 메소드 안에서만 사용이 가능한 변수
인스턴스 변수와 클래스 변수의 차이점
인스턴스 변수는 객체의 속성 중 객체에 따라 달라지는 값들을 정의할 때 사용
클래스 변수는 객체의 속성 중 공통적으로 가지는 값들을 정의할 때 사용
추가로 인스턴스/클래스 변수는 자동으로 초기화되지만 지역변수는 직접 초기화를 해줘야 함
메소드
인스턴스의 기능 정의
생성자
객체를 생성하기 편하게 하기 위해 사용
static
필드 내의 멤버를 정적 멤버로 선언하기 위해 사용
인스턴스 생성 없이 클래스명.멤버명으로 사용 가능
this()
같은 클래스 내의 생성자를 호출. 생성자 오버로딩 시 사용. 생성자의 첫줄에서만 사용 가능
this
자기 자신을 가리키는 참조변수. 멤버변수(인스턴스/클래스 변수)와 지역변수(생성자 안에 서의 변수)가 동일한 이름을 가질 때 멤버변수를 참조하기 위해 사용하는 참조변수로 위의 코드에서 this.name은 클래스 내의 멤버변수 name을 가리키고 생성자 내의 name은 생성자가 매개변수로 전달 받은 name을 가리킴
메소드와 생성자의 오버로딩
같은 이름이지만 매개변수의 타입이 다르거나 개수가 다른 경우의 메소드나 생성자를 추가로 만드는 경우
전달 받는 매개변수의 타입이나 개수에 따라 다른 기능이 실행됨
메모리의 저장위치
정적 멤버는 클래스가 생성될 때 클래스 내의 내부 공간에 저장공간을 가짐
인스턴스 변수와 지역 변수는 힙 메모리에 독립적인 공간을 가짐
배열로 비유하면
int[] 클래스_변수 = new int[1];
int[] 인스턴스_지역_변수 = new int[값이 추가되면 계속 늘어남];
내부 클래스
class 외부클래스 {
class 인스턴스내부클래스 {
//외부 클래스를 통해서만 호출 가능
외부클래스.인스턴스내부클래스;
}
static class 정적내부클래스 {
//외부클래스를 통해 정적내부클래스의 객체를 생성할 수 있음
외부클래스.정적내부클래스 객체명 = new 외부클래스.정적내부클래스();
}
void method() {
class 지역내부클래스 {
//메소드 내에서 선언 후에 바로 사용
지역내부클래스 객체명 = new 지역내부클래스();
}
}
}
인스턴스 내부 클래스는 반드시 외부 클래스를 생성한 이후에 사용 가능하고, 정적 변수와 정적 메소드는 인스턴스 내부 클래스에서는 선언 불가능