//내부 클래스
/* 클래스 내부에 또 다른 클래스가 있습니다.
* 클래스 내부에 선언된 클래스입니다. = 두 클래스가 서로 긴밀한 관계
*
* 장점
* 내부 클래스에서 외부 클래스의 멤버들을 쉽게 접근 가능합니다.
* 캡슐화, 코드의 복잡성을 줄여줍니다.
*
* 내부 클래스 : 두 클래스가 긴밀하고, 내부 클래스는 잘 사용되지 않는 것.
*
* 종류
*
* 스태틱 클래스 : 외부 클래스의 멤버 변수 선언 위치에 선언
* static 멤버처럼 다뤄집니다.
* 주로 외부 클래스의 static 멤버, 특히 static 메소드에서 사용될 목적으로 선언
*
* 멤버 클래스 : 외부 클래스의 멤버 변수 선언 위치에 선언
* 외부 클래스의 인스턴스 멤버처럼 사용
* 주로 외부 클래스의 인스턴스 멤버들과 관련된 작업에서 사용합니다.
*
* 지역 클래스 : 외부 클래스의 메소드나 초기화 블록 안에서 선언
* 선언된 영역 내부에서만 사용됩니다.
*
* 익명 클래스 : 클래스 선언과 객체의 생성을 동시에 하는 이름 없는 클래스(일회용)
*/
// static class
/* class 앞에 static이 붙은 것이 차이점
* static이 붙었기 때문에 객체 생성 없이 사용 가능합니다.
* 클래스의 static 변수처럼 사용됩니다.
* 외부 클래스와 내부 클래스는 다르게 동작합니다.
* 외부 클래스와 내부 클래스의 멤버가 private라도 상호 접근 가능
* 경로만 지정된다면 단독으로 직접 사용할 수 있습니다.
*
* 책 390p
*/
--------
///AAA객체 생성
AAA aaa = new AAA();
// System.out.println(aaa.BBB.); //불가
// System.out.println(AAA.BBB.); //안보임(static이 붙으면 보일수있음)
AAA.BBB bbb = new AAA.BBB();
System.out.println(bbb.number2);
} //end of main
}
class AAA{
private static int innerNum = BBB.number; // 접근가능, 자기의 요소로 활용하기 떄문
private static int outterNum = 100;
static class BBB {
private static int number = 10;
static int number2 = outterNum; //외부의 것도 접근 가능, 내부에서 외부로 넘어가기도 가능!
}
}
//static이 붙으면 객체 생성 없이 사용 가능!!
----------------static 메소드
//멤버 클래스
/* 멤버 클래스와 static 클래스는 외부 클래스의 멤버 변수와
* 같은 위치에 선언됩니다. 또한 멤버 변수와 같은 성질을 가집니다.
*
* 다른 책에서는 멤버 변수를 이렇게 말합니다.
* 정적 클래스 static이 아닌 경우 (static 선언이 없으면)
* 내부 클래스라고 부릅니다.
*
* 내부 클래스는 클래스 내에 선언되므로 인스턴스 속성 변수처럼 활용됩니다.
* 즉 메소드 {} 안에서만 유효합니다.
*
* 인스턴스 변수는 클래스 내에서 선언되지만 메소드 밖에서, 생성자 밖에서,
* 다른 블록 밖에서 선언 됩니다. (이 경우 반드시 초기화가 필요합니다.)
*
* 내부 클래스는 외부 클래스의 멤버를 활용할 수 있지만
* 외부 클래스는 내부 클래스의 멤버 변수를 활용할 수 없습니다.
* 또한 static이 붙은 메소드 내에서는 내부 클래스의 객체 선언 X
*/
//지역 클래스
/* Local Class
* 메소드 안에 선언한 클래스
* 선언한 메소드 내에서만 사용하기 위해 내부에 선언합니다.
* 메소드 안에서만 지역변수처럼 클래스를 활용하므로
* 메소드의 실행이 끝나면 지역 클래스는 제거됩니다.
*
* 외부에서 인스턴스를 생성할 수 없습니다.
* 또한 static을 사용할 수 없습니다.
* instance 변수 또는 메소드를 사용할 수 없습니다.
*
* final 붙은 지역변수(상수처리) 하거나 매개변수는
* 지역 클래스의 메소드에서 접근 가능합니다.
*
* 객체를 생성해서 활용해야 합니다.
* 컴파일 하면 외부클래스$숫자+로컬클래스명.class로 만들어집니다.
* 숫자는 서로 다른 메소드인 경우 같은 이름의 클래스가
* 존재할 수 있어서 구분하기 위해 붙입니다.
*
*/
//익명 클래스
/*
* Anonymous Class
*
* 클래스 이름이 없는 클래스
* 선언과 동시에 인스턴스 생성을 하나로 통합한 클래스
* 클래스를 인수의 값으로 활용하는 클래스
*
* 객체를 한번만 사용할 경우 사용합니다.
* 클래스의 선언부가 없기 때문에 이름이 없으므로
* 생성자를 가질 수 없습니다.
*
* 슈퍼클래스의 이름이나 구현할 인터페이스를 구현하거나
* 둘 이상의 인터페이스를 구현할 수 없습니다.
* 오직 하나의 클래스를 상속받거나 하나의 인스턴스만 구형 가능합니다.
*
* 코드 블럭에 클래스 선언을 하는 점만 빼고는 생성자를 호출하는 것과
* 동일합니다.
*
* 객체를 구성하는 new 문장 뒤에 클래스의 블럭{}을 첨부하여
* 몸통을 닫는 형식으로 구성됩니다.
*
* new 슈퍼클래스 또는 인터페이스명(){};
*
* 객체를 생성한 후에 {}; 즉 메소드를 구현한 블록이 있고
* 블록 끝에는 세미콜론이 붙습니다.
*
* new 뒤에 오는 생성자 명이 기존 클래스명이면
* 익명 클래스가 자동으로 클래스의 하위 클래스가 됩니다.
*
* 인터페이스인 경우에는 인터페이스를 상속하는 부모 클래스가
* Object가 됩니다.
*/
/* 프로그램에서는 데이터를 외부에서 읽고 다시 외부로 출력하는 작업이 빈번하게 일어납니다.
* 데이터는 사용자로부터 키보드를 통해 입력될 수 있고, 파일 또는 네트워크로부터 입력될 수 있습니다.
* 데이터는 반대로 모니터로 출력될 수 있고 파일로 출력되어 저장될 수 있습니다.
*
* 자바에서 데이터는 스트림(stream)을 통해 입출력 되므로 스트림의 특징을 잘 살펴야 합니다.
* 스트림은 단방향으로 연속적으로 흘러가는 것을 말합니다.
* 물이 높은 곳에서 낮은 곳으로 흐르듯, 데이터는 출발지에서 나와 도착지로 들어간다는 개념입니다.
*
* 프로그램이 데이터를 입력받을 때는 입력 스트림,
* 데이터를 내보낼 때는 출력 스트림 이라고 합니다.
*/