1. Static Methods의 목적

 1) 생성자 없이 사용 할 수 있다.

 public class StaticDemo {
 public static void main(String[] args){
  Demo[] d = new Demo[5];
  for (int i = 0; i < d.length; i++) {
   d[i] = new Demo();
  }
  System.out.println(d[0].su);
  System.out.println(d[0].num);
 }
}
class Demo{
 int su;
 static int num;
 public Demo(){
  su++;
  num++;
 }
}

 Static 변수인 num만 증가하고 su는 따로 객체를 만들기 때문에 5개의 1이 생긴다.

 

2. Static Initializers (스태틱변수 초기화)

 1) 스테틱 메모리 접근.

 public class StaticDemo1 {
 private static int su = method(); //static 멤버가 가장 먼저 메모리에 올리오기 때문에 main() 보다 method()가 먼저올라온다.
 public static void main(String[] args){
  System.out.println(su);  
 }
 private static int method(){
  System.out.println("i'm method");
  return 1000;
 }
}

 

 2) 맴버변수는 생성자가 초기화 / 스태틱변수는 스태틱 블록이 초기화 한다.

public class StaticDemo2 {
 private int su;
 private static int num;
 public StaticDemo2(){
  System.out.println("나는 생성자");
  su=10;
 } 
 public static void main(String[] args) { 
  System.out.println("나는 메인");
 }
 static{
  System.out.println("나는 스태틱 초기화 블록");
  num = 100;
 }
}

 가장 먼저 스태틱 초기화블록이 실행되고 메인이 실행된다. 스태틱 초기화블록은 최초 한번 실행되고

 

 

3. Final

 1) Final 상수 역시 생성자에서 초기화 할 수 있다.

 2) Final Methods

 

4. Deprecation

 1) java가 버전업 되면서 수정되거나 업데이트 된 클래스나 메소드를 호출 할 때 표시된다.

 2) ex : Date => Calander

 

5. Inner Classes

  1) Nested Class (Static class, 중첩클래스)

   - why : static class 를 사용해 패키징화 하기 위해 사용한다. (new 로 생성 할 필요없이 접근 가능)

   - 생성방법 : Outer.Inner in = new Outer.Inner();

   - 제한사항 : Outer의 member변수, member 메소드는 사용할 수 없다. (생성한 후 사용 가능)

 
public class NestedClassDemo {
 public static void main(String[] args) {
  Outer.Inner in = new Outer.Inner(); // Outer를 생성하지 않아도 static인 Inner에 접근가능.
  in.method1();
 }
}
class Outer{
 private int a;
 public int b;
 public Outer(){   //outer class constructor
  this.a = 5;   this.b = 10;
 }
 public static void method(){  //outer class method
  System.out.println("나는 스태틱");
 }
 static class Inner{
  private int c;
  public int d;
  public Inner(){
   this.c = 5;
   this.d = 10;
  }
  public void method1(){
   Outer out = new Outer();
   System.out.println("a ="+out.a); //static은 멤버에 접근 불가능. 주소를 가져야 하기때문에 생성자 필요
   method();  //static은 static에 바로 접근이 가능하다.
  }
  public static void method2(){}
 }
}

 

 2) Member Class

   - why : 다중 상속을 하기위해 사용한다.

   - 생성방법 : Outer.Inner in = 바깥주소.new Inner();

   - 제한사항 : Inner는 static 변수, static 메소드를 가질 수 없다.

 public class MemberClassDemo {
 public static void main(String[] args) {
  Outer1 out = new Outer1();
  Outer1.Inner1 in = out.new Inner1();
 }
}
 class Outer1{
 private int a = 5;
 private static int b= 10;
  class Inner1{
   private int c = 100;
 //  public static int d =4; //static 변수 사용 할 수 없다.
   public void method(){
    System.out.println("a="+a);
    System.out.println("b="+b);
   }  
 }
}

 

 3) Local Class

   - why :

   - 생성방법 :

   - 제한사항 : 메소드 속에서는 절차적이기 때문에 순서가있다. / public, private,protected 접근자 사용불가 / static 사용 불가 / 로컬클래스가 속해있는 메소드의 지역변수를 사용할 수 없다( 지역 상수는 사용 가능하다)

 public class LocalClassDemo {
 public static void main(String[] args) {
  Outer2 out = new Outer2();
  out.method();
 }
}
class Outer2{
 private int a= 5;
 private static int b = 10;
 public void method(){
  int c = 100; //메소드의 지역변수
  final int c2 = 100;  //지역 상수
  class Inner2{
   private int d = 100;
   public Inner2(){
    System.out.println("나는 생성자");
   }
   public void display(){ 
    System.out.println(a+b+d);
   // System.out.println(c);  // 사용 불가
    System.out.println(c2); //사용가능
   }
  }
  Inner2 in = new Inner2(); // method() 내에서는 순차적으로 처리된다.(Inner2를 알고있어야 생성가능)
  in.display();
 }
}

 

4) Anonymous Class

   - why : 상속 관계가 아니어도 Overriding 할 수 있다.

   - 생성방법 :

   - 제한사항 :

 public class AnonymousClassDemo {
 public static void main(String[] args) {
  Super s = new Super(){
   public void display(){
    System.out.println("hello22");
   }
  };
  s.display();
 }
}
class Super{
 public void display(){
  System.out.println("hello");
 }
}

 

 

6. Enum

 1) 고정된 갯수의 나열을 갖는 데이터를 갖는다.

 2) 데이터 형이 없다.

 3) 선언될 상수가 가장 윗줄에 작성되어야 한다.

 4) 생성자는 public을 사용 할 수 없다.

 public class EnumDemo {
 public static void main(String[] args) {
  for (Subjects s : Subjects.values()) {
   System.out.print(s+"-->");
   System.out.print(s.ordinal()+"==>"); //나열순서 출력
   System.out.print(s.get()+"==>");
   System.out.println(getInfo(s));
  }
 }
 static String getInfo(Subjects s){
  String info = null;
  switch(s){
  case JAVA : info ="열정" ; break;
  case JDBC : info ="Oracle" ; break;
  case JSP : info ="Javascript" ; break;
  case Android : info ="SmartPhone" ; break;
  case Project : info ="Idea" ; break;
  }
  return info;
 }
}

 public enum Subjects {
 JAVA(1), JDBC(10), JSP(100), Android(1000), Project(10000);
 Subjects(int v){ //생성자는 public 사용 안됨.
  this.v = v;
 }
 private final int v;
 public int get(){
  return this.v;
 }
}

 

+ Recent posts