
라이브러리 클래스 : 실행 x, 다른 클래스에서 이용하는 클래스
실행 클래스 : main() 메서드를 가진 실행 가능한 클래스
new 연산자
클래스로부터 객체를 생성하며 연이어 생성자를 호출해서 객체를 초기화하는 역할
클래스 변수 = new 클래스 ();
Scanner sc = new Sccaner(System.in);
구성
public class Example {
//필드
int fieldName;
//생성자 선언
Eaxmple() {...}
//메서드 선언
int methodName() {...}
}

클래스에 생성자 선언이 없으면 컴파일러는 기본 생성자(Defalt Constructor)를 바이트코드 파일에 자동추가한다.
new 연산자로 생성자를 호출할 때, 매개변수를 통해 매개값을 생성자 블록 내부로 전달.
public class Cosmetic {
int price;
String color;
String type = "cosmetic";
Cosmetic (int price, String color) {
this.price = price;
this.coloe = coloe;
}
}
// 다른 클래스에서 Cosmetic 객체 생성 시,
Cosmetic c = new Cosmetic(500, red);
this 활용
리턴타입 메서드명 (매개변수,...,) {...}
가변인자 : 내부적으로 배열을 생성해서 사용함 , 오버로딩시, 컴파일러의 혼란을 야기할 수 있어 가변인자 메서드엔 오버로딩 사용 지양.
ex) print 메서드
void method(String...srt) {...}
.method("hi","gi","fi");
.methid(new String[] {"hi","gi","fi"});
Instance - 객체 소속 멤버 / 객체 생성 후 사용
Static - 클래스 고정 멤버 / 객체 생성 없이 사용 가능 : 객체마다 가지고 있을 필요성이 없는 공용적 필드
객체는 힙 영역에, 메서드는 메서드 영역에. 클래스로더는 클래스를 메소드 영역에 저장하고 사용하므로 정적 필드/메서드는 메서드 영역에서 사용된다.
따라서 인스턴스 필드를 이용하지 않는 메소드는 정적 메소드로 선언하는 것이 좋다.
public class Calculator {
String color;
static double pi = 3.14159;
void serColor(String color) {this.color = color}; // 내부 인스턴트 필드를 사용
static int plus(int x, int y) {return x + y;} // 외부 매개변수만을 가지고 동작하므로 static이 좋음
}
정적 필드, 메서드 접근법 -> . 도트 연산자
result = Calculator.plus(1,2);
result2 = 10 * 10 * Calculator.pi;
정적 메서드/블록은 객체가 없어도 실행된다는 특징 때문에 내부에 인스턴스 필드/메서드를 사용 할 수 없으며 객체 자신의 참조인 this도 사용할 수 없다.
객체를 새로 생성 후 참조변수로 접근하는 것은 가능 . main() 생각하면 쉬움
static void method() {
instanceField = 10; // [x]
this.instanceField = 10; // [x]
instanceMethod(); // [x]
// 🔽 올바른 방법.
ClassName obj = new ClassName();
obj.instanceField = 10;
}
객체의 필드를 외부에서 수정이 가능할 경우, 객체의 무결성이 깨진다.
해결 방법으로, private로 필드 접근을 막고, 메서드를 통해 필드에 접근하는 방식을 취한다. 메서드를 통해 유효한 값만 필드로 저장되도록 제어가 가능하기 때문 --> setter()
애플리케이션 전체에서 단 한 개의 객체만 생성해서 사용하고 싶을 때 싱글톤 패턴 적용
생성자를 private로 접근 제한하고, 외부에서 new 연산자로 생성자를 호출 할 수 없게한다.
대신, 정적 메서드를 통해 간접적으로 만들어진 객체를 얻을 수 있다.
public class Example {
private static Example ex = new Example(); // 이 만들어진 static 객체를 하나로 사용할것임. static으로 해야 객체가 실행과 동시에 만들어짐.
private Example() {} // 생성자를 private 적용해서, 외부에서 new 연산자로 불러오기 불가능
// public 접근 권한을 갖는 정적 메서드 선언, 외부에선 이 메서드로 만들어진 객체에 접근. static -> static 영역에서 힙 영역을 참조할 수 없다' 는 자바 문법 사항 때문
public static Example getInstance() {
return ex;
}
}