국비지원학원/Java

33일차

초코맛 2018. 12. 6. 21:51
반응형
*class
-abstract class, interface class
  • -일반메소드가 있어서 override안해도 되고 vs 꼭 해야하는 차이  but, default 가 가능해지며 차이가 없어졌다.
  • -interface는 다중상속의 이점~! interface 조합을 많이 사용하게 된다.
  • -구현의 강제성: 추상메소드-overriding하지 않으면 Error
-innerclass-innerclass
-innerclass-nested class
-innerclass-local class
-innerclass-anonymous class
*자주사용하는 class
*inner class(안긴 클래스)
  • Event를 처리하기 위해 만들어진 클래스들
  • JDK 1.2에서부터 추가된 문법
  • 종류로 inner, nested, local, anonymous가 있다.
  • 안쪽클래스들은 바깥클래스의 자원을 마음대로 사용할 수 있다.
-inner class 
  • <얘만 인스턴스가 독특 / inner class의 instence화가..5번째가된다. <-객체화(5가지중 5번째)
  • 클래스를 인스턴스 변수처럼 사용할때 사용.
  • Event를 화면 디자인 클래스에서 생성하고 처리할 때 (해당화면에 대해서만 Event를 처리할 때)
  • <안쪽클래스에서는 모든 밖의 자원?사용가능
  • 안쪽클래스의 접근지정자는 public으로 부여한다.
  • 컴파일을 하면 byte code(.class파일이)가 생성되는데, 바깥 클래스명.class가 생기고(Outer.class) 바깥클래스명.안쪽클래스명.class라고 생성되어야 하는데, 윈도우에서"."은 실행될 프로그램을 지정해주는것으로 닷이 두개면 혼란을 야기할수 있어서 자바언어 외부에서는 그안을 이야기 할때 $를 붙이게 된다. 따라서 inner class는 Outer$Inner.class
  • $: 자바언어 외부(os)에서 자바언어 내부를 의미하는 기호로 사용하게 된다.
  • ex) C:\dev\Java\jdk1.8.0_191\jre\lib\rt.jar
  • 객체화)
1.바깥클래스를 객체화(상속관계는 아니지만 엄마와 아기처럼 엄마먼저)
    클래스명 객체명 = new 생성자();
    Outer out = new Outer();
2.안쪽클래스를 객체화(바깥클래스의 객체가 반드시 필요)
    [바깥클래스명.]안쪽클래스명 객체명 = 바깥클래스의객체명.new 안쪽클래스의생성자();
    Outer.Inner in = out.new Inner();
           그,안   =>(안쪽클래스의 자원 사용)


-nested class(중첩 클래스)
  • 안쪽 클래스를 static 변수처럼 사용할 때 사용.
    • <static 변수(어떤 instance에도 속해있지않음(공용) / 객체의크기(heap영역)에 영향을 끼치지않음)
  • 이벤트를 공용 이벤트로 처리할 때 사용.
  • 내부 클래스의 자원은 가급적이면 static으로 만들어 사용한다.
    • 클래스명.변수명.클래스명.method명 의 형태로 사용.
    • 인스턴스 변수와 생성자가 생성은 가능한데 하지 않는것을 권장.
  • <클래스 접근지정자중 일반은 public default 2가지뿐이라 static은 일반클래스가 아니다.
  • static 클래스 안에 변수와 method는 static을 붙여서 사용해야한다.
    • 안붙이면 instance화를 해야하기 때문에 가급적이라했지만 거의 다가 맞다.
  • 안쪽 클래스에서는 바깥 클래스를 사용할 수 있다.
    • static 인것만 사용가능.
  • 바깥 클래스는 안쪽클래스를 사용할 수 있다.
    • 객체화 없이 빠르게 사용가능하며,static 문법으로 사용(클래스명.변수명 / 클래스명.method명)
  • 파일명을 보면 $로 inner클래스를 표시하지만 inner클래스의 종류를 알기가 어렵다.

-local class
  • 안쪽 클래스를 지역변수처럼 사용할 때 사용.
  • method 안에 정의 하는 클래스        <(인스턴스화 해야 가지게 됨)
  • method가 호출되었다고 객체가 생성되지 않는다.
  • <생명이 가장 짧은 클래스. 메소드 호출이 끝나면 사라짐.
  • 객체중 생명이 가장 짧다.           <(호출-객체화(생성)-닫힘괄호-사라짐)
  • 특징 : 안쪽 클래스에서 instance 변수는 참조 가능 하나, 지역변수와 parameter는 final이 붙어있는 변수만 참조 가능하다.
    • 단,JDK 1.8 에서부터는 final 이 붙지않아도 참조가능하다. 출력만 가능하고, 값할당은 불가능(책에서는 생략되는것이지, 값변동이있으면 Error난다고 함.)
  • local 변수처럼 method 외부에서 접근할 수 없다.
    • 반환형으로 나가는것은 가능하지만 외부에서 그 method를 쓸 수는 없다.(메소드 내에서만 사용가능)
  • 소스 code : 바깥클래스명.class
  • byte code : 바깥클래스명$1내부클래스명.class
  • 구분위해 숫자붙임?

     

     

-anonymous innerclass
  • <Arguments:인자값, 메소드에 집어 넣는 값.
  • 익명클래스(이름이 없는 클래스)
  • 매개변수에 입력되는 값으로 클래스를 사용.
    • 매개변수에 입력되는 값=Arguments(인수값)

class Test{
    public void test(Fly f){    //이때 Fly의 모든 자식 넣을수 있다. 다 받으려면 Object obj 단,특정메소드를 부르려면 ㄴㄴㄴ
        f.speed("빠른");
    }
}
=>Test를 어떻게 불러야 할까여?
1.Fly를 구현한 클래스를 생성.

Fly


|      FlyTmpl은 Fly이다. (is a 관계-자식은 부모이다.)
|

FlyTmp


2.구현한 클래스를 객체화
Fly f= new FlyTmpl();

3.Test 클래스를 객체화
Test t = new Test();

4.method 호출
t.test(f);
t.test(??);//FlyTmpl?
//<인터페이스를 매개변수로 받을수 있게 된다.
=>이번거로움을 줄이기 위한게 anonymous innerclass

  • 한 번 호출로 작업이 종료되는 경우 사용. (재사용성 꽝)
  • 클래스의 재사용성이 없다.(한번쓰고 끝)
  • 문법)
호출하는method명(new 부모클래스명() or 구현인터페이스명 { //앞의 대상을 부모로 하는 이름없는 클래스가 생성된다.
//익명클래스..
    method Override() {            }
    method정의(){            }
);
//클래스를 따로 만들필요가 없다.
  • 이 소스코드가 Compile되면 외부클래스명.class와 외부클래스명$1.class, 2.class, 3.class...<이름이 없어서 1,2,3,,,이렇게 된다.
import를 알아야 하기에 import먼저

*import
  • class가 존재하는 package가 아닌 외부 package내의 다른 클래스나 interface를 참조하여 사용하는 기능(문법)
  • <남의 패키지에있는걸 가져다 쓰는것.
  • java.lang package내의 클래스는 자동 import가 된다.
  • package 선언과 class 선언 사이에 필요한 만큼 처리한다.

packgae 패키지명(역방향 도메인);

import...

public class 클래스명{

  • import를 받은 클래스나 interface는 클래스 내부에서 패키지명 없이 사용할 수 있다.
  • JDK 1.5에서부터는 static import라는 기능이 추가되었다.   <다른 클래스나 패키지의 static을 편하게 쓸수있는?
  • 문법)
특정 패키지내의 모든 클래스를 참조)
    import 패키지명.*; => 모든 인터페이스를,, 모든 ...classes
    <*은 모두 다 라서 찾는과정이 들어가 속도가 느려진다.

특정 패키지내의 하나의 클래스또는 인터페이스를 참조)
    import 패키지명.클래스명;  => 하나의 클래스...<     =>속도가 더빨라서 더 좋다.

  • 주의)
  • 패키지명은 다르나 클래스(또는 인터페이스) 명이 같은 경우에는 둘중 하나만 import받을 수 있다.
  • 나머지 하나는 full path로 처리..     <앞에 패키지명까지 다 쓰는경우. (String 과 같은이름의 클래스를 만들었더니 썻었음.)
  •                        =>패키지명을 모두 기술하여 클래스를 작성하는 것.
  • <몇번이든 사용가능.


-Static import
  • 다른 클래스의 static 변수(상수) 또는 static method를 내 클래스에 존재하는 것처럼 사용할 때 사용.
  • JDK 1.5 에서부터 지원되는 기능.
  • 문법)
변수/상수 사용)
import static 패키지명.클래스명.static변수(상수);
method 사용)
import static 패키지명.클래스명.static method;    //()붙이면 Error

package abc;

import static java.lang.Integer.parseInt;
//일반 import는 class나 interface인데, static은 변수/상수나 method

class Test{
    public void test(){
        Integer.parseInt("10");
        //여러번 쓰려면 계속 다써야 한다.

        parseInt("10");
        //쓰려면 import(클래스명이 필요없어진다.)
}


*자주 사용하는 클래스들
  • <API에서 객체생성이 되는지(추상클래스)먼저 -> 생성자 -> method -> 반환형/매개변수
  • <이게 API에서 class를 보는 순서. (값은 field를 보면된다.)

-문자열 관련 class들
  • String, StringBuffer, StringBuilder, StringTokenizer
  • => java.lang                                   =>java.util

  • 1.String : 문자열 저장소의 주소를 참조.(같은 문자열은 하나만 생성), method를 호출하여 일을 하면 원본문자열이 변경되지 않는다.
  • 2.StringBuffer :                                                \
  • 3.StringBuilder(JDK 1.5에서 추가된 클래스) : /=>객체에 문자열을 바로 저장, 같은문자열이 여러개 만들어진다.(바로 heap에 들어가면 되서 속도↑), method를 호출하여 일을하면 문자열이 변경된다. 
    • buffer는 multi thread에서 동시접근이 불가능/ builder는 multi thread에서 동시접근이 가능.
    • ex) 은행에가서 돈을 찾을수 있는 2가지 카드/통장 동시에 인출하는거...multi  / 안전은 buffer..
    • 문자열에 +연산을 하면 Compiler가 JDK 1.5이하면 StringBuffer로 처리하고, JDK 1.5이상 이라면 StringBuilder로 처리한다.


  • ↓순으로 나옴.(개발됨)
  • buffer쓸줄알면 builder도 쓸줄안다(거어의 같음.)
  • 제일 나중에 나올수록 빠르다. (↓순으로 빠르다.)

 

반응형

'국비지원학원 > Java' 카테고리의 다른 글

35일차  (0) 2018.12.08
34일차  (0) 2018.12.06
32일차  (0) 2018.12.06
31일차  (0) 2018.12.03
30일차  (0) 2018.12.03