1, 클래스(class)는 서로 다른 여러 데이터형을 자유로이 조합하여 만들 수 있는 자료구조이다.
2. 클래스형 변수 선언과 인스턴스 생성
만약 ABC라는 클래스가 있고 ABC클래스의 인스턴스를 생성하고 싶으면 다음과 같이 할 수 있다.
ABC 변수명 = new ABC() ;
(ABC클래스형 변수 선언) (인스턴스 생성)
변수 명은 그냥 변수 이름일 뿐 본체가 아니다. 대신 변수명을 통해 인스턴스 본체에 접근할 수 있다.
3. 클래스 변수와 인스턴스 변수, 지역변수
클래스 내부에서 선언된 변수를 전역변수라 하고 이 안에는 클래스 변수와 인스턴스 변수가 있다.
- 클래스 변수 : static 이 앞에 붙어있고 모든 인스턴스들이 공통된 값으로 사용한다.
클래스가 로딩될 때 생성되며 사용시 클래스명.변수명으로 사용해야 한다.
- 인스턴스 변수 : 인스턴스 마다 다른 값을 갖게되는 변수로 인스턴스가 생성될 때 같이 생성된다.
사용시 인스턴스명.변수명으로 사용해야 한다..
클래스가아닌 메서드, 생성자 등의 블럭 안에서 선언되는 변수를 지역변수라고 한다.
- 지역변수 : 메서드, 생성자 등이 실행될 때 생성되며 종료될때 소멸한다. 정해진 블럭 밖에서 사용될 수 없다.
4. new 연산자로 생성하는 것들을 Object 라고 부른다. (=객체)
5. 파이널 클래스 : 클래스 접근 제한자인 final을 붙여 클래스를 선언하면 하위 클래스를 가질 수 없는 파이널 클래스가 된다. 즉 다른 클래스가 상속할 수 없는 클래스가 된다.
6. 상위 클래스, 하위 클래스 : 클래스가 다른 클래스를 상속할 때 class A extends B 로 상속하며 이는 A가 B를 상속받았다는 뜻이다. A는 상속을 받은 하위 클래스가 되고 B는 부모클래스인 상위클래스가 된다.
extends가 없이 생성되는 클래스는 상위 클래스가 없는 것처럼 보이지만 사실 Object라는 상위 클래스를 갖고 있다. 모든 클래스 중에 유일하게 Object 클래스만이 상위 클래스를 갖지 않는다.
7. 인터페이스 구현 : 클래스에 인터페이스를 구현하려면 class Y implements X 로 구현해야한다. 이는 인터페이스 X를 구현하는 클래스 Y의 선언이다. 인터페이스 X를 Y에 구현했다면 인터페이스 X 내부의 변수, 추상 메서드들을 Y 클래스에 Overriding(재정의)해야 한다.
8. 추상 클래스 : 추상클래스는 클래스 앞에 abstract를 붙여 선언한 클래스를 말한다. 추상클래스는 추상 매서드를 갖고 있고 불완전한 클래스이므로 인스턴스를 만들 수 없다. 그래서 사용하기 위해선 다른 클래스가 추상클래스를 상속해야하고 상속받은 클래스는 추상클래스 내의 추상매서드들을 Overriding(재정의) 해야한다. 따라서 뺴먹지 않고 반드시 구현해야하는 매서드가 있는 경우 추상클래스를 통해 상속시켜 메서드 구현을 강제할 수 있다.
9. 중첩 클래스 : 클래스 또는 인터페이스 안에 선언한 클래스를 중첩 클래스라고 한다. 중첩 클래스는 크게 정적 중첩 클래스와 내부 클래스로 나뉘고 내부 클래스는 또 내부 클래스와 지역 클래스, 익명 클래스 3개로 나뉜다.
9-1-1) 내부 클래스
일반 클래스 내부에 생성되며 밖에 있는 클래스는 내부 클래스를 멤버변수처럼 사용할 수 있다. 사용하려면 new 연산자로 인스턴스를 만들어야 한다. 내부 클래스는 자신의 밖에 있는 외부 클래스의 자원을 직접 사용할 수 있다. 그리고 정적 중첩 클래스와 구별점으로 클래스와 내부에 static 선언이 불가능 하다.
class Inner{
int A = 12; // 외부 클래스 멤버
class Innerclass{ // 내부 클래스
int a = 100;
void example(){
System.out.println(A); // 외부 클래스 멤버 사용
System.out.println(a); // 내부 클래스 멤버 사용
}
}
void go(){
Innerclass in = new Innerclass(); // 내부 클래스의 인스턴스 생성
in.example(); // 내부 클래스의 메서드 실행
}
}
public class Main {
public static void main(String[] args) {
Inner in = new Inner(); // 외부 클래스의 인스턴스 생성
in.go(); // 외부 클래스의 메서드 실행
}
}
9-1-2) 지역 클래스
외부 클래스 내부 블럭 내에 생성된 클래스를 말하며 블럭(메서드, 반복문, if문 등...) 내부에서 정의되어 지역 변수 같은 역할을 한다. 생성된 블럭 내부에서만 new 연산자로 인스턴스 생성 후 사용이 가능하며 블럭 밖에서 쓰일 수 없고 접근 제어자(private, public 등...)을 사용할 수 없다. 자신을 둘러싼 클래스의 멤버에는 접근이 가능하나 그 멤버들이 초기화 된 후 값이 변하지 않거나 final 선언이 되어있어야 한다 .
class OuterClass{
private int a = 1; // OuterClass 클래스의 멤버 변수
public void localMethod(){ // OuterClass 클래스의 멤버 메소드
int b = 10; // 메소드의 지역 변수 (지역클래스에 사용되려면 final 값이어야함
// 따라서 b값은 초기화 된 순간부터 변하면 안됨)
class LocalClass{ // 메소드 내부에서 정의된 Local inner class
private int c = 100;
public void displayNum(){
System.out.println("a = " + a); // 외부 클래스의 멤버 변수
System.out.println("b = " + b); // 내부 클래스와 동일 스코프(블록) 내의 지역 변수
System.out.println("c = " + c); // 내부 클래스의 멤버 변수
}
}
LocalClass loc = new LocalClass();
loc.displayNum();
}
}
public class Main {
public static void main(String[] args) {
System.out.println("Local Inner Class (지역 내부 클래스)\n");
OuterClass out = new OuterClass();
out.localMethod();
}
}
9-1-3) 익명 클래스
클래스 정의와 객체화를 동시에 하는 클래스이다. 그러다보니 일회성으로 자주 사용되며, 이름이 없는 지역 클래스로 인스턴스 이름이 없다. new와 동시에 부모 클래스를 상속받아 내부에서 오버라이딩 해서 사용한다.
형식 : new 부모 클래스 (생성자 매개변수){ // 클래스 몸체 }
class Foo{
void dosomething(){
System.out.println("익명 최고");
}
}
public class Main {
public static void main(String[] args) {
new Foo(){
public void dosomething(){
System.out.println("조성현 짱");
}
}.dosomething();
}
}
+ 익명클래스의 특징
(1) 익명클래스 내부의 변수나 메서드는 익명클래스 밖에서 사용이 불가능하다.
(2) 상속받아야 하지만 한번만 쓸거라 extends 문법을 굳이 사용하지 않을 때 사용한다.
(3) 익명클래스 내부에 생성자를 사용할 수 없다.
(4) 매개변수로도 사용이 가능하다.
(5) 익명 클래스 외부 자원은 final이 붙은 것만 쓸 수 있다.
(6) 부모 클래스가 존재해야 상속받고 오버라이딩 할 수 있다.
9-2) 정적 중첩 클래스
내부 클래스와 비슷하나 static으로 선언한다. 외부 클래스의 자원을 마음대로 쓸 수 있는 내부 클래스와 달리 정적 중첩 클래스는 static 키워드가 없는 외부 자원은 사용할 수 없다. 특이한 점은 내부 클래스와 달리 외부 클래스의 객체가 없어도 정적 중첩 클래스의 객체 생성이 가능하다.
ex) 외부 클래스.정적 중첩 클래스 객체명 = new 외부 클래스. 정적 중첩 클래스();
class Inner{
static int A = 12; // 외부 클래스 멤버
static class Innerclass{ // 내부 클래스
int a = 100;
void example(){
System.out.println(A); // 외부 클래스 멤버 사용
System.out.println(a); // 내부 클래스 멤버 사용
}
}
}
public class Main {
public static void main(String[] args) {
Inner.Innerclass in = new Inner.Innerclass();
// 외부 클래스의 인스턴스 생성 없이 내부 클래스의 인스턴스 생성
in.example(); // 내부 클래스의 메서드 실행
}
}
제너릭스와 Comparable, Comparator (0) | 2023.01.09 |
---|---|
Java import선언과 Java.lang 패키지 + 클래스 메서드와 인스턴스 메서드 (0) | 2023.01.09 |
배열 검색 알고리즘 (선형 검색, 이진 검색) (0) | 2023.01.09 |
기본 자료구조 (배열+수학알고리즘) (0) | 2023.01.06 |
드모르간 법칙 (0) | 2023.01.05 |