반응형
*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도 쓸줄안다(거어의 같음.)
-
제일 나중에 나올수록 빠르다. (↓순으로 빠르다.)
반응형