211231 Instance, Static, Singleton
*캡슐화
외부 객체는 객체 내부 구조를 알 수 없고 객체가 노출해 제공하는 것만 이용 가능하게 하는 것
-> 이것을 결정하는게 접근제어자!
*클래스 변수
new 연산자에 리턴된 객체의 주소 저장( 레퍼런스 변수, 참조타입 변수)
*메소드 오버로딩Overloading
- 클래스 내에 같은 이름 메소드를 여러 개 선언
- 한 이름으로 다양한 매개값을 받기 위한 것
조건: 매개변수의 타입, 개수, 순서가 달라야 함 아무튼 같은 모양 두 개는 안됨
주소값 전달에 의한 메소드 호출(Call by Reference)
****
Class StaitcT{
static int a=10; //정적 필드 -> 사용시 객체 필요X, static 영역(공유영역)에 저장
int b=20; //인스턴스 필드 -> 사용시 객체 필요, heap 영역에 저장, 값 공유X
}
* 인스턴스 멤버: 객체(인스턴스)마다 가지고 있는 필드와 메소드 -> 객체 있어야 사용 가능
(참고)
this.
- 객체 내부에서 객체 멤버변수임을 명확히 하기 위해 사용
- 매개변수와 필드명이 동일할 때 객체의 필드임을 명확히 하기 위해 사용
* 정적static 멤버: 공유를 목적으로 쉽게 호출시키려는 목적 ex. 정적 필드, 정적 메소드...
클래스에 소속된 멤버이고 이런 멤버는 따로 객체 생성 없이 클래스에 바로 접근해 사용할 수 있음
객체 내부에 존재하는건 아니고 메소드 영역에 존재 ex. static sum(){ }
사용: 클래스명.연산자로 접근
class Sum{
static int plus(){}
}
위의 sum 클래스의 plus 메소드를 호출하고 싶다면 main 메소드에서
int result=Sum.plus(); 로 호출해 사용하면 됨!
참고)
Sum s=new Sum();
int sum=s.plus();
이런 방식이 안 되는 건 아닌데 굳이? 생성자 없는 클래스의 경우엔 오류나니까 위의 방식으로 버릇들여야됨
정적 필드를 사용하는 Math 클래스를 이용해보기
Math 클래스의 메소드가 전부 정적static이므로 이렇게 호출해 사용할 수 있음
*정적 필드값을 새 객체를 생성해 불러오는 방식으로 선언시킬때 그 필드값은 heap 영역이 아닌 static 영역에 저장됨 따라서 객체를 여러 개 생성해 각 각채마다 필드를 호출한다 해도 그것들은 모두 같은 필드값을 공유하게 됨 왜냐면 heap영역에 매번 새 영역을 만들어주는게 아니라 static 메모리 내부에 값이 저장되는 것이기 때문!
* 정적 메소드 사용시 유의할점
1. 정적 메소드에서는 this 레퍼런스 변수 사용 불가능
2. 정적 메소드에서는 일반적인 변수 사용 불가능: int a 사용 불가 (메모리 영역 자체가 다름)
정적 메소드에서는 정적멤버변수만 사용가능함 static int a같은 것만 사용 가능
3. 정적 메소드는 메소드 오버라이딩되지 않는다.
인스턴스 변수는 인스턴스 메소드에서 사용하면 되고 이런 일반 메소드는 호출 시 새 객체 선언해서 그 변수로 호출해야 함
차이 기억하기!
*싱글톤
: 하나의 어플리케이션 내에 하나만 생성되는 객체 -> 객체 생성을 한 번만 수행하는 것!
보통 다른 클래스의 static 아닌 메소드는 바로 공유가 안돼서 객체를 생성해서 접근해야 하는데 싱글톤은 하나의 객체를 만들어두고 그 객체를 공유하는 방식인 것임
왜냐면 여러 사용자가 프로그램을 사용한다고 할 때 사용자마다 다 객체를 새로 선언시키는 방식을 사용하게 되면 메모리를 효율적으로 사용하지 못하니까 재활용할 수 있게 미리 정적 메소드로 객체를 하나 생성해 공유시킨 것. DAO 같은 부분에서 사용하므로 기억해둘 것.