//static
특징 : 프로그램 실행시 static으로 지정된 멤버가 자동으로 메모리에 로드
         프로그램 종료시 소멸, 객체 생성과 무관, 단한번 실행
         접근은 클래스이름.멤버
사용 : 
 클래스 : inner클래스에서 사용
 멤버변수 : 인스턴스간 공유목적
 멤버메서드 : 객체 생성없이 접근할 목적으로 사용
예제 :
public class Count{
 private int number;
 private static int counter=0;
 public static int getCount(){ return counter; }
 public static getNumber(){ return number; }
 public Count(){ counter++; number=counter; }
}
#error
public class TestCount{
 psvm{
  sout(Count.getCount());
 Count count1 = new Count();
 sout(Count.getCount());
 Count count2 = new Count();
 sout(count2.getCount());
 }
}

주의할점 :
   static메서드에서 인스턴스변수를 사용하지 못한다.(new할때 heap메모리에 올라가는것이므로)
   static메서드에서 인식할수 있는 변수는 static변수, 로컬변수
//singleton디자인 패턴
정의 : 단하나의 인스턴스만 생성하는 경우에 사용 static이용
작성단계 :
 1. 생성자를 private로 지정
 2. 자신의 클래스에서 객체생성  - static으로 지정하여 프로그램 실행시 객체생성
 3. 다른클래스에서 접근할수 있는방법을 제공
public class Earth{
 private static Earth e = new Earth("지구");
 String name;
 public String getName(){ return name; }
 private Earth(String name) {this.name = name; }
 public static Earth getEarth(){ return e; }
}

public class TestEarth{
 psmv{ 
  Earth e = Earth.getEarth();
  sout(e.getName());
}
//final
특징 : '금지'의 의미
용도 : 클래스 - 상속금지 ,  멤버메서드 - overriding금지,  멤버변수 - 상수
상수 : 값의 변경X, 모든클래스에서 공유, 상수명은 대문자    public static final TOTAL_NUM=40;
//abstract
정의 : 추상적인 실체없는
용도 : 클래스 - 추상클래스, 멤버메서드 - 추상메서드
 - 추상메서드 : body가 없는 메서드  public abstract void run();
//추상클래스
정의 : 클래스 선언시 abstract지정자로 선언된 클래스
특징 : 객체생성 불가능, 멤버변수, 생성자, 추상메서드 , 일반메서드 모두 가능
         추상메서드가 없어도 추상클래스선언 가능
         추상메서드가 있으면 반드시 추상클래스로 선언
         하위클래스에서 멤버를 재사용(overriding)
         Type으로 사용가능 (다형성의 의미   -   A는 추상 A'는 일반 A를 상속    A  a = new A')
         하위클래스에 강제성과 통일성
용도 : 하위클래스에서 반드시 구현해야하는 메서드를 상위클래스에서 실제 구현하지않고 하위클래스에서 하게 함. 추상메서드로 선언하여 강제성과 통일성을 줄수 있음.
//interface
정의 : class대신 interface로 선언한 객체
특징 : 객체생성 불가능. 멤버 : 상수, 추상메서드만 가능
         하위클래스에서 멤버를 재사용 통일성 강제성
         Type으로 사용가능, 단일상속의 약점 보완, 다중 구현
용도 : 기능만을 하위클래스에 강제
예제 : 
public interface Car{
 public void speedUp();
 public void speedDown();
}
#error

public class SportsCar implements Car{
 public void speedUp(){ sout(..) }
 public void speedDown(){ sout(..) }
}
//내부클래스
정의 : 특정클래스 내부에 또다른 클래스가 정의
class Outer{
  class Inner{   }
}
용도 : 서로 독립적인 관계가 아닌 하나의 멤버처럼 사용
특징 : 내부클래스는 외부클래스의 모든 멤버를 자신의 멤버처럼 사용가능(외부가 private더라도 접근가)
  static으로 내부클래스를 만든것을 제외한 모든 내부클래스는 항상 외부클래스에서 접근가능
종류 :
 1. member : 외부클래스의 멤버변수나 멤버메소드와 같이 내부클래스가 정의
     -내부클래스를 생성하려면 먼저 외부클래스를 생성해야함.
      Outer outer = new Outer();
      Outer.Inner inner = outer.new Inner();
 2. local : 외부클래스의 특정 메소드 내에서 내부클래스가 정의
     -메서드 안에서 내부클래스를 객체 생성
     -멤버메서드의 로컬변수와 같이 동작. 메서드 호출시 생성 끝나면 소멸
     -외부클래스의 멤버변수와 상수만 접근가능(로컬변수 접근불가)
    예제 : 
     public String getName(){ return name; }
     public int getAge(){ return age; }
     public void inner_test(){
       int num = 0;
       final int size = 10;
         class Inner_class{
            private String address;
            public Inner_class(String add){
                 address = add;
            }
            public String getInfo(){
  sout(num);
  sout(size);
  return name+age+address;
            }
          }
          Inner_class in = new Inner_class("대철");
          sout(in.getInfo());
     }
     #error

    public class TestInner{
      psvm{
         Outer_class outer = new Outer_class("대철",20);
         outer.inner_test();
      }    
    }
 3. static : 내부클래스 내에 static멤버가있는경우 static 내부클래스로 정의
      - 외부클래스의 멤버변수 접근은 불가능
   public class Outer{
     private String name;
     class Inner{
       static int age = 25;
       sout(name);
     }
   }
  #error*2

  public class TestInner{
   psvm{
     Outer.Inner inner = new Outer.Inner();
   }
  }

 
 4. anonymous : 내부클래스가 이름없이 정의 (AWT에서 이벤트처리시 주로)


         
신고
Posted by 대절님

댓글을 달아 주세요



티스토리 툴바