1. 추상(Abstract) 클래스

      빼낸다 -> 불안전한 메서드 생성 -> 인스턴스를 생성할수 없다

     상속을 통하여 완전한 메서드로 사용(상속된 메서드는 구현체 일명 Implement 또는 Service)

     1개라도 추상클래스가 있으면 추상클래스 

 

     참고) 메서드 4요소 :  메서드 이름, 파라메터 갯수타입, return value, body

             

 

    1.1 추상클래스의 개념

          - 추상클래스를 상속받은 클래스는 추상클래스가 가지고 있는 모든 추상클래스들 오버라이딩 해야한다.

    1.2 추상클래스 문법

          super가 소유한 추상메서드 

         안보이는거 보이기(생략문구 찾기)

          abstract void bb()  --> public void bb의 추상(즉 public static 생략됨)

     1.3 추상클래스의 사용이유

           일을 동시 진행 협업을 하기 위해   -> 없어도 구현할수 있다  생성만 빼고

package day2.abstractexam;

abstract class Afunction{
	public abstract void searchInform(String name, int phoneNum) ;
	public abstract void runService(int memberId, int request) ;
}

class AfunctionImpl extends Afunction{

	@Override
	public void searchInform(String name, int phoneNum) {
		System.out.println(name + " 고객님의 정보를 찾았습니다");
		
	}

	@Override
	public void runService(int memberId, int request) {
		System.out.println(memberId + " 고객님의 요청하신 서비스를 수행합니다");
	}	
}

public class AbstractExam {

	public static void main(String[] args) {
		Afunction aref = new AfunctionImpl() ;   //Afunction로 임시 넣고 가능 동시진행이유
		
		aref.searchInform("장그래", 0101112222) ;
		aref.runService(100, 1) ;
	}
}

2. 인터페이스(Interface)

   2.1 인터페이스의 개념      

         - 100% 불완전한 메서드로 이루어진 것

         - 열거형(클래스가 아닌것이 클래스.변수로 사용 즉 public static final이 생략됨)

     용어상)  두개의 물체가 만나는 접속면

       java는 다중상속을 지원하지 않음 -> 단일상속이다

  2.2 인터페이스 문법

           - 공식적인 클래스가 아님(Interface로 선언)

           - extends로 선언 불가  -> implements 키워드 사용

           - 메서드 오러라이딩의 원칙 -> 즉 public 만 접근제어 가능(public static final 생략됨)

 

    참고) 메서드 overriding의 접근제어 고찰

            접근제어는 같거나 넓어질수만 있다(Interface는 항상 접근제어는 public이다)

  2.3 인터페이스의 사용이유

          다중상속(x) -> 느슨한 결함(Loose Coupling)관계를 만들기 위해

          Oracle, DB2 등등   회사가 바뀌어도 기능은 동일하게 즉 메서드가 변하지 않는다(코드변화가 없다)

 

  2.4 인터페이스의 기타 사용

     2.4.1 C언어의 열거형(enum type)처럼 사용되는경우

interface Week
{
   int SUN=0, MON=1, TUE=2, WED=3, THU=4, FRI=5, SAT=6 ;
}

  열거형(클래스가 아닌것이 클래스.변수로 사용 즉 public static final이 생략됨)

 

2.4.2 마크 인터페이스(Mark Inteface 또는 Tag Interface)

    아무런 형태없이 텅 빈상태(분류를 위해 사용)

      Data1 Data2 하나는 상속 아니면 없음

   ~able로 선언된것들이 대부분 Serializable과 Parcelable, Cloneable, Runnable 등등

 

 

2. 내부클래스(Inner Class)

1. 내부클래스 (Inner Class or Instance Class)

    내부클래스는 외부클래스에 대해 변수접근 가능 -> 캡슐화 강도가 최대가 되는 장점이 있다(a 와 b 클래스를 나눌수 없다)

   - 내부클래스에서는 외부클래스의 변수와 메서드를 자유롭게 사용할수 있다

   - 내부 클래스 이름앞에 접근제어는 4종류 모두 사용가능하다

   - 내부 클래스는 외부클래스가 소유하고 있는 변수 , 메서드와 동일하게 취급된다.

 

1.1 내부클래스(Inner Class or Instance Class)

         반드시 외부클래스 생성후 내부클래스 생성해야된다.

         OuterClass out = new OuterClass();

         OuterClass.Inner in = out.new Inner();

   

1.2 정적 내부 클래스(Static Class)

     내부클래스가 static사용하여 

    - 외부클래스를 인스턴스 생성하지 않아도 내부클래스를 사용가능(static은 메모리 생성)

    - 정적 내부 클래스에서는 외부 클래스의 static 변수와 메서드만 접근 가능

 

1.3 지역 클래스(Local Class)

     외부클래스의 메서드 내부에서 선언되는 클래스 

    - 외부클래스가 가지고 있는 모든 인스턴스 변수, static변수, 메서드 접근 가능

    - 지역클래스가 선언된 메서드가 가지고 있는 지역변수 접근가능(단 final로 선언된 변수만 접근가능)

    - 지역변수와 같은 특성으로 메서드 내부에서만 인스턴스 생성가능

    - 지역 클래스는 지역변수처럼 접근제어가 default인 변수만 선언 가능

    - 메서드 종료시 메모리 삭제됨 (중괄호가 닫히기전에 생성과 사용이 끝나야됨 return type은 꼭 상위interface로)

package day2.localclass;

class LocalClassExample{
    private int num1 = 0;
    private static int num2 = 10;
    private static final int num3 = 100;     

    public void outerMethod1() {
          String city1 = "서울";
          final String city2 = "뉴욕";
          System.out.println(city1);
          System.out.println(city2);
          System.out.println("파리");
    } 


    public void outerMethod2() {
          //public int aa= 0; 컴파일 에러
          String hello = "안녕하세요";
          //private final int bb = 1; 컴파일 에러
          //private static int cc = 2; 컴파일 에러
          final int finalNumber = 2015;             

          	class Local {
                 		public void localMethod() {
                     		System.out.println("외부클래스 메서드 접근가능");
                     		outerMethod1();
                    		System.out.println("외부클래스 변수 접근가능");
                     		System.out.println(num1);
                    		System.out.println(num2);
                     		System.out.println(num3);
                 		}

                 		public void localMemberDisplay() {
                     		System.out.println(
                      		"LocalClass를 포함하는 메서드의 변수 : ");
                     		//System.out.println(hello); 컴파일 에러
                     		System.out.println(finalNumber);
                		}
          	}
          Local local = new Local();
          local.localMethod();
          local.localMemberDisplay();
    }
} 

public class LocalClass {

	public static void main(String[] args) {
		LocalClassExample test = new LocalClassExample();
         test.outerMethod2();

	}
}

 

1.4 무명 클래스(Anonymous Class)

 지역클래스하고 유사 다만 클래스 선언이 아에 없는 특이한 구조로 클래스 이름이 없다, 다만 인스턴스생성과 구현만 있음

 - 인터페이스를 구현한 클래스의 사용빈도가 극히 적을 경우

 - 한번만 사용되는 인스턴스인 경우

 ==> 태생이 지역클래스의 일부 생략

        그리고 마지막에 ";"으로 끝난다, interface앞에 new가 있다

package day2.anonymous;

interface Anony 
{
	public void readName();
}

class OuterClass
{
	private String className;
	
	OuterClass(String className)
	{
		this.className=className;
	}
	
	public Anony outerMethod(final String id)
	{		
		return new Anony()
		{
			public void readName()
			{
				System.out.println("Outer ClassName: "+className);
				System.out.println("Local ID: "+id);
			}			
		};
	}
}

class Anonymous
{	
	public static void main(String[] args)
	{
		OuterClass out=new OuterClass("My Outer Class");
		Anony ano1=out.outerMethod("My First Anonymous Class");
		ano1. readName();
		
		Anony ano2=out.outerMethod("My Second Anonymous Class");
		ano2.readName();
	}
}

return new Anony() { body };- > class AnonyLocal implements Anony 와 같다

※ Anony 는 interface이다

3. 기타문법

1. Enum Type

     java5에서 시작

     열거형의 태생은 가독성을 위해 switch하고 같이 사용하려구

1.1 Enum 개념

      Interface에서 사용 예

     

     enum형(메서드 파라메터 타입에 열거형 즉 validation하기 위해 - 잘못됬을때 멈춤)

  사용시 클래스 없이 접근 가능

 

1.2 Enum 메서드와 enum상수에 데이터 입력

   생성자와 동일하게 사용되는데  static 부분과 static 이 아닌부분으로 나누어짐

   열거형 상수가 진화하여 문자열도 사용가능(단 getter, setter를 생성)

     = > Class가 아닌대 대문자, 

    ※ setter는 생성자로, public static final 숨겨있음

package day2.enumparents3;

enum Parents {
	   FATHER("아버지"), MOTHER("어머니");
	   
	   private String call;
	   
	   Parents(String call){
	        this.call = call;
	    }

	    String getCall(){
	        return call;
	    }
}

public class EnumParents3 {
	public static void printParents (Parents p){
		System.out.println(p);
	}

	public static void print(Parents d){
		switch (d) {
		case FATHER: 
			System.out.println("아빠");
			break;
		
		case MOTHER:        
			System.out.println("엄마");
			break;
			
		default:
			System.out.println("부모님 중 한 분만 !!");	
		}
	}

	public static void main(String[] args) {
		printParents(Parents. MOTHER);
		print(Parents.FATHER);
		print(Parents.MOTHER);
//		print(Parents.BROTHER);  컴파일 에러
		
		for(Parents p : Parents.values()){
		    System.out.println("enum 내부 데이터 : " + p);
		}

		System.out.println(Parents.FATHER.getCall());
	}
}

             value관련 메서드는 static, 다른건 non-static변수임 레퍼변수.상수.name.... 

1.3 Enum 실제 클래스 사용

      역컴파일로 풀면 Enum을 상속받은 class로 만들어짐

 

   참고) for each (=enhanced - for)

    두덩어리  1) 저장소에 들어간 타입 

                    2) java저장소 2가지 배열, 클래스만 있고 무조건 처음부터 끝까지

   for(저장소 타입 : 저장소)

2. Variable Argument

    java5에서 시작 

    method overloding을 피하기 위해 생겨남

 

2.1 Vaiable Arguments 개념

  클래스 overloding의 확장 개념이라고 생각됨

- 메서드 호출시 파라미터의 개수를 마음대로 선언할수 있다

- 파라미터 선언시 항상 마지막에 위치(혼합사용)

- 자동으로 1차원 배열처리 해준다

  ex) public static void vArg(String name, int .. gnums){

     for(int s : gnums.values()){

     }

    for(저장소 타입 : 저장소)  

+ Recent posts