GitHub

https://github.com/Backcoder-June

BackCoder 기록 그리고 숙달

Back to the Java

Modifier - 접근제어자 / static / final / +싱글톤

Backcoder 2022. 6. 23. 19:01

< modifier >

- 클래스, 변수, 메소드, 생성자를 선언할 때 앞에 붙어서 
"접근가능한 범위" /  "활용방법" 을 지정해주는 예약어들 

                          클래스   변수   메소드   생성자 
1. 접근제어자 
public                    o           o           o           o
protected              x           o           o           o
private                  x           o           o           o

 

- 다른 클래스의 변수나 메소드 등을 가져와서 사용할 때,

   그 클래스 객체를 만들어서 사용하고자 할때도,  제한이 있다.    => " 접근제어자 "
< 접근제어자 > 
private - 현재 클래스 내부에서만 사용 가능 / 객체 만들어도 못가져옴     => 쓰고싶으면 메소드로 가져가라
default(패키지상태) - 현재 클래스 + 현재 패키지 내부 사용 가능  
protected - 현재 클래스 + 현재패키지 + 다른 패키지에서 상속받은 클래스 
public - 무제한. 어떤 클래스에서도 사용 가능 

(+) class D extends "package1". A {   }   => 다른 패키지 클래스 상속 => "패키지명" 명시 해줘야 한다. 

 

 

 


2. < 활용방법을 알려주는 modifier > - static / final  / abstract 
abstract                o           x           o            x 
static                    x            o          o            x
final                      o            o         o             x

 
< final 변수 > 
=> 변수값 1번 할당 이후 수정 불가 => 상수 constant 
< final 메소드> 
=> Overriding 불가
< final class > 
=> 상속 불가 

static String nation = "대한민국";     // 공유변수로 줘도 
p1.nation = "미국";           // 뒤에서 바꾸면 바뀐다. 

=> static final String nation = "대한민국" // 이렇게 하면 안바뀌는 공유값
           => " static final " 세트로 많이많이 쓴다! 

 


< static > // 정적이다  // + 공유 // (=클래스 변수)
=> 시작 부터 끝까지 정적인 값 유지한다.                         =>( 자체는 변하지 않지만, 

                                                                                                Overriding 해서 사용하는 곳에서는 바꿔서 사용 가능)
=> 따로 별도의 영역(번지주소)에 모아둔다.(999번지)                                  => final 까지 붙이면 고정공유값! 
=> 객체들이 공유해서 사용하려면 미리 만들어져 있어야 겠지 
    ( 안만들어진 시점에는 당연히 못쓴다. ) 
=> 그 Class 영역 내의 모든객체가 공유한다.

+ 다른 Class 에서는 객체생성없이 class 자체만으로도 소환 가능
        Person.nation / p1.nation  둘다 가능하다.  

< 활용 => 싱글톤 > 
 class의 생성자가 private 로 만들어졌을때, 객체 생성 불가능.         
    => class 내에서 가져올 메소드나 변수를 static 으로 지정 
    =>  싱글톤 

public Company getC1( ) { return c1; }               (X) 이것도 객체 있어야 사용 가능

public static Compnay getC1( ){ return c1; }       => 이렇게 하면, 객체 생성안하고 바로 사용 가능 

 

Company c1 = compnay.getC1( );

                c1 = c2 = c3 . . . 

"유일한 고정값" 으로 생성 된다. => 싱글톤 

=> instance 객체를 여러개 생성하면 문제가 될 때 사용한다. ex. 캘린터/시계 등  



Stack                    Heap 
p1:100번지     100: name = 김철민
age = 27 

p2:150번지     150: name = 김지원 
age  =22 


static           999번지 : nation = 대한민국
국적 공통 
static String nation = "대한민국" 

sout( p1.nation ) sout( p2.nation ) => 대한민국 

 

 

< static method >
String name; 
int age; 
static String nation = "대한민국";   <= static 공유변수 

(평 ㅡ 범) 
그냥 (non-static) 메소드는 일반변수, static변수 당연히 사용 가능하다. 
void showPerson( ){ sout(name / age / nation }        

(특 ㅡ 수) 
static void showNation( ){     <= static 공유메소드 
sout ( nation )  ( O )    <= 공유가 되어있는 공유변수는 사용가능하지만
sout ( name )   ( X ) }   <= 일반변수 (공유가 안되있잖아) 
메소드가 공유메소든데 공유변수여야 그걸로 메소드를 만들지 
=> static은 static 끼리 놀아라. (특 수)