ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • java :: InnerClass (내부클래스)
    IT/Java & JSP & FW 2011. 12. 23. 12:48
    InnerClass
    내부클래스는 효율적인 관리를 위한 하나의 형식으로, 하나의 주 클래스 내부에 별도의 클래스를 넣어서 관리 할 수 있는 형태 

    InnerClass의 종류(Class 정의 위치에 따라 분류된다.)
    - Non_StaticClass (동적내부클래스, 사용빈도 높음)
    - StaticClass (정적내부클래스)
    - NamedLocalClass (지역내부클래스)
    - AnonymousClass (익명내부클래스, 사용빈도 높음)


    Non-StaticClass

    사용형식

    Outer 객체1=new Outer();
    Outer.Inner 객체2=객체1.new Inner(); 

     
    특징
    - 내부클래스는  Outer 클래스명 $Inner클래스명.class형식 으로 생성
    - Inner 클래스는 Outer 클래스의 멤버이용 가능
    - Outer 클래스는 Inner 클래스의 멤버사용 불가
    - static 메소드 내에서는 내부 클래스의 객체 선언 불가 

    예제
    (아래 InnerTest.java 파일을 참조)


    Static Class
    non static class 과 다른 점?
    다른 것 없이 클래스 이름 앞에 스태틱 이라는 예약어만 붙이면 정적 내부 클래스라 부른다

    사용형식

    Outer.Inner 객체=new Outer.Inner();

     - 정적 내부 클래스는 static 특성을 따르기 때문에 객체를 따로 만들 수 있다.

    예제
    (InnerTest.java)
    class Outer{
    	int a=100;
    	
    	public void test1(){
    		System.out.println("test()1~");
    	}
    	
    	//Inner member class
    	//Outer 객체를 통해서만 만들수 있다.
    	class Inner{
    		int b=200;
    		
    		public void test2(){
    			System.out.println("test()2~");
    		}
    	}
    	
    	//static inner class
    	//메모리상에 이미 올라갔기에 사용방법이 위랑 다르다.
    	static class SInner{
    		int c=300;
    		
    		public void test3(){
    			System.out.println("test3()");
    		}
    		public static void test4(){  //이 프로그램을 실행할 때 이 메소드도 메모리 상에 올라간다.
    			System.out.println("test4()");
    		}
    	}
    }
    
    
    public class InnerTest {
    
    	public static void main(String[] args) {
    		Outer o=new Outer();
    		System.out.println("o.a : "+o.a);
    		o.test1();
    		
    		//Inner 클래스 객체 생성방법 및 사용방법
    		Outer.Inner oi=o.new Inner();  //주의
    		System.out.println("oi.b : "+oi.b);
    		oi.test2();
    		
    		Outer.SInner soi=new Outer.SInner();
    		System.out.println("soi.c : "+soi.c);
    		soi.test3();
    		
    		Outer.SInner.test4();  //위의 SInner 클래스의 test4()메소드 확인
    	}
    }
    


    Named Local Class
    - 클래스를 정의를 한 다음에만 사용할 수 있다.
    - 다른 클래스의 상속이 불가능하다.
    - 컴파일하면 OuterClass$숫자+로컬클래스명의 클래스 파일이 생성된다.
    - 숫자는 인덱스를 의미하는데, 서로 다른 메소드인 경우 동일 이름의 클래스가 존재할 수 있기 때문에 중간에 인덱스 역활의 숫자를 붙여 구분되도록 한다. 

    예제
    (LocalTest.java) 
    public class LocalTest {
    
    	String s="***"; 
    	
    	//메소드 안에 클래스 생성하기
    	public void bar(){
    		final String ss="###";  //지역변수 - 외부에서 참조나 변경이 안된다.
    		//final을 붙여 고정을 시키면 참조가 가능해진다.
    		
    		System.out.println("s="+s);
    		System.out.println("ss="+ss);
    		
    		//이 클래스는 이 메소드 안에서만 사용이 가능하다.
    		class NamedLocalTest{  //클래스는 설계도를 만드는 것이다.
    			String sss="$$$";  //클래스이기 때문에 자신만의 맴버 변수를 가질 수 있음
    			public void pr(){
    				System.out.println("sss="+sss);
    				System.out.println("s="+s);
    				System.out.println("ss="+ss);
    			}
    		}
    		
    		NamedLocalTest lte=new NamedLocalTest();  //클래스로부터 객체생성을 해주어야 사용가능하다.
    		lte.pr();
    	}
    	
    	public static void main(String[] args) {
    		LocalTest lt=new LocalTest();
    		lt.bar();  //실행을 해도 클래스 부분은 나오지 않는다.
    	}
    }
    


    AnonymousClass
    - 객체이름을 갖지 않는 내부 클래스
    - 단 한번만 객체 생성이 가능하다.
    - 객체를 생성하는 문장 뒤에 클래스의 블럭을 사용하는 방법으로 구성
    - new 키워드 뒤 생성자의 명칭이 기존 클래스 명일 경우에는 Anonymous클래스가 자동적으로 클래스의 자식 클래스가 되며, 인터페이스일 경우에는 이 인터페이스를 상속하는 클래스로서, 부모 클래스가 Object 가 된다.

    예제
    (NoInnerTest.java)
    class NoInner{
    	int a=100;
    	
    	public NoInner(){
    		getInfo();
    	}
    	
    	public void getInfo(){}
    }
    
    public class NoInnerTest {
    
    	public static void main(String[] args) {
    		
    		//이름 없는 자식을 생성
    		new NoInner(){
    			public void getInfo(){
    				System.out.println("a="+a);
    				System.out.println("이건 익명클래스로 재정이한 매소드");
    			}	
    		};  //new NoInner()에서 {}붙임으로 익명 클래스를 만듬
    		
    	}
    }
    


    Thread
     
    Process란?
    운영체제 내에 실행중인 프로그램을 의미

    Multi-Process란?
    두 개 이상의 프로그램이 두 개 이상의 cpu에서 실행되는 것을 의미

    Multi-Tasking이란?
    하나의 cpu에서 여러 개의 프로그램이 실행되는 것처럼 보여지는 것

    Thread란
    프로세스 내에서 실행되는 세부 작업단위.

    Thread 구현방법1
    Thread를 상속받는 방법
    1. java.lang.Thread 클래스를 상속받는 클래스를 작성
    2. run() 메소드 오버라이딩하여 구현
    3. main() 메소드에서 스레드를 상속받은 클래스의 객체를  생성
    4. 해당스레드 객체의 start() 메소드 호출 

    Thread 구현방법2
    Runnable을 상속받는 방법
    1. java.lang.Runnable 인터페이스를 상속받아 클래스를 구현 한다
    2. run() 메소드를 오버라이딩 하여 구현
    3. main() 에서 Runnable  로 구현한 클래스 객체 생성
    4. Thread  객체를 생성하여 Runnable 로 생성 한 객체를 넘겨 줌
    5. Thread 객체에서 start() 메소드를 호출 

     Thread주요 메소드
    strat()
    activeCount()
    currentThread()
    setName()
    getName()
    sleep()
    yield()
    join()
    interrupt()
    setPriority()
    getPriority()

    예제-1
    (ThreadTest.java)
    class ThreadA extends Thread{  //Thread 클래스를 상속받음으로서 Thread를 구현 할 수있게 된다.
    	public void run(){  //main역활
    		System.out.println("ThreadA시작");
    		for(int i=1;i<=10;i++){
    			System.out.println("ThreadA의 값 "+i);
    		}
    		System.out.println("ThreadA끝");
    	}
    }
    
    class ThreadB implements Runnable{
    	@Override
    	public void run() {
    		// TODO Auto-generated method stub
    		System.out.println("ThreadB시작");
    		for(int i=1;i<=10;i++){
    			System.out.println("ThreadB의 값 "+i);
    		}
    		System.out.println("ThreadB끝");
    	}
    }
    
    public class ThreadTest {
    	
    	public static void main(String[] args) {
    		
    		//스레스 사용법
    		ThreadA ta=new ThreadA();
    //		ta.run();  //단순(일반적인) 메소드 호출방법
    		System.out.println("-------------------");
    		ta.start();  //메소드를 시작함
    		
    		ThreadB tb=new ThreadB();
    		Thread temp=new Thread(tb);  //객체 tb를 실제 Thread 생성자에 넣음으로 진짜 Thread를 만듬
    		temp.start();
    		
    /**		ta.setName("첫번째 쓰래드");
    		temp.setName("두번째스레드");
    		System.out.println("dd"+ta.getName());
    		System.out.println("###"+temp.getName());
    		System.out.println("쓰래드 총 개수 :"+Thread.activeCount());
    **/
    		
    		ta.setPriority(Thread.MAX_PRIORITY);
    		temp.setPriority(Thread.MIN_PRIORITY);
    		
    		Thread.yield();
    		
    		System.out.println("ThreadA의 우선순위:"+ta.getPriority());
    		System.out.println("ThreadB의 우선순위:"+temp.getPriority());
    		
    		//우선순위를 줄때 join()메소드 사용
    /**		try {
    			ta.join();  //main이 ta가 끝날때까지 기다리고 
    			temp.join();  // 또 main이 temp가 끝날 때까지 기다린다.
    		} catch (InterruptedException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    **/
    		
    		System.out.println("메인스레드 시작~");
    		for(int i=1;i<=10;i++){
    			System.out.println("메인스레드 값 "+i);
    		}
    		System.out.println("메인스레드 끝~");
    	}
    
    }
    
    예제-2
    (ThreadTest2.java)
    public class ThreadTest2 {
    
    	public static void main(String[] args) {
    		
    		for(int i=0;i<20;i++){
    			System.out.println(i);
    			
    			try {
    				Thread.sleep(1000);  //한번 출력하고 1초 재운다.
    			} catch (InterruptedException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		}
    	}
    }
    


    자바로 시계 만들기
    (Clock.java)
    import java.util.*;
    
    public class Clock {
    	public static void main(String[] args) {
    		while(true){
    			Calendar now=Calendar.getInstance();
    			int h=now.get(Calendar.HOUR);
    			int m=now.get(Calendar.MINUTE);
    			int s=now.get(Calendar.SECOND);
    			
    			String str=h+"시 "+m+"분 "+s+"초 ";
    			System.out.println(str+"\r");
    		}
    	}
    }
Designed by Tistory.