728x90
반응형

접근제어자

private

- 접근금지 ( method는 상속 안 되며 method overriding 금지 ) 자기 자신 접근 가능

 

public

- 접근허용 ( 다른 폴더에 있는 클래스는 접근하기 위해서는 public 선언이 필요하다 )

 

default

- 같은 패키지일 때 접근허용, 다른 패키지일 때 접근금지 상속관계인 경우라도 접근금지

 

protected

- 같은 패키지일 때 접근허용, 다른 패키지일 때 접근금지 상속관계인 경우 허용

 


 

기타제어자

final

- 위치 : 클래스 앞(상속금지), 메서드 앞(overriding 금지), 변수 앞(재할당 금지)

 

abstract

- 위치 : 클래스 앞, 메서드 앞 의미 : 추상적이라는 의미

 

static

- 위치 : 멤버변수 적용가능 static 변수; 의미 : 클래스에 속한 것이란 의미

- 위치 : method 적용가능 static 메서드(); 의미 : 메서드는 static 선언된 것만 호출가능 하다

- 상속관계가 성립되더라도 static은 그 값은 변화가 없다

 

클래스 앞에 선언이 되는 접근제어자 : public, default 그 외의 접근제어자는 변수에 사용

public > protected > default > private

 

#static static은 객체생성 전에 메모리에 할당된다

위치 : 멤버변수, method 적용가능 의미 : 클래스에 속한 것이란 의미

 


class A{

  public static void main(String[] args){

    System.out.println(Math.PI);

  }
}

클래스 변수(static이 선언된 멤버변수) : 모든 객체가 공유하는 변수

객체변수(static이 선언되지 않은 멤버변수) : 객체에 속한 변수

 


class A{

  static int a=100; // 클래스변수

  int b=200; // 객체변수

  A(){ a++; b++; }

}

class B{

  public static void main(String[] args){

  A o1=new A();

  System.out.println(A.a); // 101 클래스 변수의 형태를 보더라도 객체 생성한 변수는 통합적으로 적용된다

  System.out.println(o1.b); // 201

  A o2=new A();

  System.out.println(A.a); // 102

  System.out.println(o2.b); // 201

  A o3=new A();

  System.out.println(A.a); // 103

  System.out.println(o3.b); // 201

  }
}

 

 

#static 블록 : 클래스가 로드될 때 자동으로 호출되는 메서드


class A{ 		

  static{ System.out.println(1);} // static이 선언되어 있으면 자동으로 호출이 된다 그래서
  
}					// 변수나 메서드 앞에 선언되어있다면 그 변수와 메서드가 자동 호출된다

//static{ 실행문 }  // 그래서 static 블록안에 선언문과 호출문은 자동으로 호출된다


class B{			// static{실행문}은 실행문 안에 static선언 했던 것들만 사용 할 수 있다

  static{ System.out.println(2); }	
  
  public static void main(String... args){
  
  System.out.println(3);
}

 


 

instance 블록 – 시그니쳐는 {}만으로 실행가능하다 {}안에 실행문이 자동으로 실행한다


class A{

{ //<-- instance 블록 - 원하지 않아도 자동으로 실행되기때문에

  System.out.print("객체생성되기전에반드시"); //작업의 유연성이 떨어지므로 비추천

  System.out.println("실행해야하는소스코드");

  for(int a=1; a<=10; a++)

  System.out.print(a+" ");

} //<-- instance 블록

  A(){

  System.out.println("AAA");

  }

  A(int n){

  System.out.println("BBB");

  }

  A(String s){

  System.out.println("CCC");

  }

}



class B{

  public static void main(String... args){

    A o1=new A();

    A o2=new A(100);

    A o3=new A("abc");
  }
}

 

private 선언된 생성자를 객체생성 하기


class A{ 

  private A(){}

  static A abc(){ return new A(); } // method def를 호출하기 위해서 클래스 A의 객체생성이 필요하다 하지만

  void def(){ System.out.println(1); } // 생성자 A가 private 선언되어 있어 객체생성 접근이 불가능하다. 하지만

} // method abc() 실행문에 return new A()를 활용한다면 객체생성을 할 수 있다


class B{ 
		 
  public static void main(String[] args){ 
  		// 반환형인 abc()는 static이 선언되어있어 객체생성 없이 클래스 이름으로 호출이
		// 가능하다는 이점을 활용하자 abc() 참조형 A이므로 호출문 작성하면
        //이 된다. 이때 A.abc()=new A() return 값이 저장되기에
  A o=A.abc(); A o=A.abc(); 	// 식을 풀이하면 객체생성 때와 같은 식이 성립된다

  o.def(); A o=new A() 
}

 

( 객체 생성할 수 없는 클래스 객체생성 활용 예문 )

java.util.Calendar클래스의 getInstance method 호출하는 소스코드 ( 객체 생성할 수 없는 클래스 객체생성 하기 )

Calendar클래스는 어떠한 이유로 객체생성이 되지 않는다


 

import java.util.Calendar;
class A{
 public static void main(String[] args){
 
 Calendar o=Calendar.getInstance();		//getInstance()는 반환형으로 return 값이 Calendar이다

  }					//그래서 달력정보를 호출하려면 getInstance()를 꼭 사용하여야 한다
}
					// java.util.Calendar클래스의 클래스변수 
					// YEAR, MONTH, DATE의 값을 출력하는 소스코드


import java.util.Calendar;

class A{
 
 public static void main(String[] args){
 
 System.out.println(Calendar.YEAR);		// 1	YEAR, MONTH, DATE static이 선언된 클래스 변수이다

 System.out.println(Calendar.MONTH);	// 2

 System.out.println(Calendar.DATE);		// 5
 }
}

 

 

java.util.Calendar클래스의 get메서드 호출하는 소스코드

 


import java.util.Calendar;
class A{

 public static void main(String[] args){
 
 Calendar o=Calendar.getInstance();	//옆 예문에서 private 선언된 생성자를 객체 생성하는 방법과
 
 	int y=o.get(Calendar.YEAR);		//유사한 방법으로 활용할 수 있다
    
 	int m=o.get(Calendar.MONTH)+1;
    
 	int d=o.get(Calendar.DATE);
    
	System.out.println(y);
    
	System.out.println(m);
    
	System.out.println(d);
 }
}

 

 

static 활용 예문이다 


class Child{
  String name;
  
  static int candyNum;
  
  Child(String n){	name=n; candyNum=10;}

  void eatCandy(){ candyNum--;
}


class A{
   public static void main(String[] args){
   
     Child c1=new Child("진우");
     
     Child c2=new Child("서진");
     
     System.out.println(c1.name);
     
     System.out.println(c2.name);
     
     System.out.println(c1.candyNum); // 10
     
     System.out.println(c2.candyNum); // 10
     
     c1.eatCandy(); // 진우(이)가 사탕을 먹는다 사탕수:9
     
     c1.eatCandy(); // 진우(이)가 사탕을 먹는다 사탕수:8
     
     c2.eatCandy(); // 서진(이)가 사탕을 먹는다 사탕수:9
     
     System.out.println(c1.candyNum); // 7	
     		//가독성을 위해서 Child.candyNum로 고쳐주는 것이 좋다.
     
     System.out.println(c2.candyNum); // 7	
     		//그 이유는 static을 선언하여 공용으로 사용하는 의미를 내포하고 있다.
  }
}

 

class A{
    static int a=100;
    
    int b=200;
    
    void c(){
    
        System.out.println(a);
        
        System.out.println(b);
    }
    
    static void d(){
    
        System.out.println(a);		//static 간에 호출 가능
        
        System.out.println(b);		//컴파일에러
    }
}


class B{
	public static void main(String[] args){
    
		A.d();
        
		A o=new A();
  }
}

 


 

# final

위치 : 마지막이라는 의미

의미 : 클래스 앞(상속금지), 메서드 앞(overriding 금지), 변수 앞(재할당 금지)

 

 

final 클래스 앞에 선언될 때 예문


final class A{ //final은 class에서 상속할 것이 없을 때 확장(상속) 금지를 선언할 때 사용한다

  static int a=100; //옆에 예문처럼 static만 선언되어있다면 상속할 필요가 없으므로

  static int b(){ return 200; } //final을 선언해서 상속하는 것을 막아야 한다

} //static은 공용처럼 사용할 수 있으며 어떤 변수가 초기화하거나 재할당하게 되면


class B extends A{ 그 값은 독자적인 값으로 여러 객체생성을 하면 그 값은 한 개의 값으로 선언된다

  void c(){

  System.out.println(a);

  }

}


class C{

  public static void main(String args[]){

  B o1=new B(); o1.a=300; = A.a=300; //가독성을 위해 변경해야한다

  B o2=new B(); o2.c();

  }

}


//final 변수 앞에 선언될 때 예문

class A{

  final int num;

  A(int n){

    num=n; //생성자에서 로컬변수의 최초 재할당은 가능하다.

    num=300; // 컴파일에러

  }

  void a(){

  num=400; // 컴파일에러

  }

}



interface A{ //자동으로 접근제어자 선언됨

  void abc(); 
  
} //interface를 선언하게되면 그 클래스 해당하는 메서드는 static final void abc();라는 형식이

  //숨겨져 있다 그래서 범위가 정해지고 public > protected > default > private


class B implements A{

  public void abc(){ //앞에는 public을 꼭 선언해야 오버라이딩을 할 수 있다

  } //그리고 interface를 선언하게되면 개체생성을 하지 못하고 구현개체를 개별로 선언해주고

} //부모상족자로 interface 클래스를 선언하여 interface가 가지고있는 메서드를 구현 개체에

//오버라이딩을 해서 그 구현하게된다




 

다음은 다항적 변수와 abstract을 활용하는 방법을 알아보자

 

 

 

2020/06/14 - [Java/Java 입문] - [Java] 상속자, 은닉변수, super(), this의 활용

 

[Java] 상속자, 은닉변수, super(), this의 활용

-상속자- 모든 생성자의 첫 번째 줄에는 super() 소스코드가 생략되어 있다. 단, 생성자의 첫 번째 줄에 super() 또는 this()가 선언된 경우 super() 소스코드는 추가되지 않는다. 객체간의 관계 is a관계 :

tantangerine.tistory.com

 

 

 

 

728x90
반응형

+ Recent posts

Powered by Tistory, Designed by wallel