📖 싱글톤 Singleton 예제
package day15;
class SingleT {
//싱글톤으로 만들기
// 2)외부에서 객체 생성 못하니 내부에서 객체 미리 만들어 주고, 바로 사용할 수있도록 static
// 클래스 외부에서 다른 변수에 넣지 못하도록(훼손하지 못하게) private
private static SingleT instance = new SingleT(); //
// 1)외부에서 더이상 생성자를 만들 수 없도록 private으로 생성자 만듬
private SingleT() {}
// 3) 외부에서 가져다 쓸 수 있는 get메소드 만들기, 외부에서 접근 가능하도록 public
// 인스턴스 메소드로 만들면 사용하기 위해 외부에서 객체를 생성하여야 하기 때문에 static으로
public static SingleT getInstance() { return instance;}
// 일반 인스턴스 변수
int a = 100;
// 일반 인스턴스 메소드 : 객체 생성후 사용가능
void func() {
System.out.println("싱글톤");
}
}
public class SinglrT {
public static void main(String[] args) {
//SingleT s = new SingleT(); // 외부에서 객체생성 불가!!
//SingleT.instance;
SingleT s = SingleT.getInstance(); // 객체 한개 생성된거 얻어다 사용
SingleT s1 = SingleT.getInstance();
System.out.println("s.a : " + s.a);
System.out.println("s1.a : " + s1.a);
s.a = 200;
System.out.println("s.a : " + s.a); // 동일한 주소값을 같이 들고있어서 s변수로 값변경해도 같이 영향이 있음
System.out.println("s1.a : " + s1.a);
System.out.println(s);
System.out.println(s1);
}
}
🖥️ console 출력 화면
🔈 SingT 클래스 내부에서 미리 생성한 객체를 얻어다 쓰는것이기 때문에 같은 주소값을 들고 있다. 그래서 내부멤버를 어느 누가 변경해도 전체에 영향이 있다.
📖 내부 클래스 inner class 예제
package day15;
// inner 클래스 만들기
class A { // 인스턴스 외부 클래스
A(){System.out.println("A 객체 생성");}
// 1.인스턴스 멤버 내부 클래스
class B{
B(){System.out.println("B 객체 생성");}
int x;
void func1(){ System.out.println("B클래스 메소드 실행"); }
// static 불가 > A,B는 객체 생성하고 사용해야 하기 때문에 static이 올 수 없음
}
// 2. static 멤버 내부 클래스
static class C {
C() {System.out.println("C 객체 생성");}
int x;
void func1(){ System.out.println("C클래스 메소드 실행"); }
static int y; // static class 이기에 static 올 수 있음
static void fun2() {System.out.println("C클래스 static 메소드 실행")}
}
// 인스턴스 메소드
void methodA() {
System.out.println("메소드 A 호출");
class D{ // 3. 메소드 안에 있는 지역클래스
D() {System.out.println("D 객체 생성");}
int x;
void func1() {System.out.println("D클래스 메소드 실행");}
}
// 지역 클래스 객체 생성, 위 지역클래스는 메소드가 끝나면 사라지기 때문에 메소드 내부에서 객체 생성을 함
D d = new D();
System.out.println(d.x);
d.x = 300;
System.out.println(d.x);
}
}
public class InnerEx01 {
public static void main(String[] args) {
System.out.println("인스턴스 멤버 클래스 객체 생성");
// 인스턴스 멤버 클래스 객체 생성
A a = new A(); // 1.외부 클래스 객체 생성 > 2.내부 클래스 객체 생성해줘야 함
A.B b = a.new B(); // 외부클래스 참조변수명.new 내부클래스명();
System.out.println(b.x); // 만들어진 객체 b 변수에 넣어서 사용 가능
b.x = 10;
System.out.println(b.x);
System.out.println("---------------");
// static 멤버 클래스 객체 생성
System.out.println("static 멤버 클래스 객체 생성");
A.C c = new A.C(); // 타고 들어가서 바로 내부클래스 객체 생성 가능
System.out.println(c.x); // 인스턴스 변수
c.x = 100;
System.out.println(c.x);
System.out.println(A.C.y); // static 변수는 클래스명으로도 사용 가능하니 외부.내부.타고 들어가서 사용 가능
c.func1();
System.out.println("---------------");
// 지역 메소드 호출
System.out.println("지역 메소드 호출");
A a1 = new A();
a1.methodA();
}
}
🖥️ console 출력 화면
🔈 출력 결과를 보면 "static 멤버 B클래스"는 생성할때 A외부 클래스 객체를 생성하지 않고 자신의 객체를 바로 생성한 것을 알 수 있다.
"지역 클래스D"의 경우 지역 메소드 안에 위치하고 있기 때문에 지역메소드를 호출해야 실행되는 것을 알 수 있다.
①외부클래스 객체 생성 ②내부 지역클래스가 위치하고 있는 메소드 호출하면 ③내부 지역클래스가 객체 생성 후 사용 -> 메소드 안에서 객체 생성부터 사용될 수 있도록 구현해 놔야함
📖 익명클래스 annoymous class 예제
package day15;
interface MyInter{ // 골격만 짜놓음
void func(); // 추상메소드 public abstract 키워드 생략
}
public class AnonyEx01 {
public static void main(String[] args) {
// 인터페이스 -> 구현한 클래스 정의(오버라이딩)
// -> 구현클래스 객체 생성해서 오버라이딩 된 메소드 호출 사용
// 단발성으로 정의해서 호출하여 사용
new MyInter() { // 객체 생성
@Override // 정의
public void func() { // 구현부 구현
System.out.println("MyInter 의 func() 오버라이딩된 메소드 호출");
}
}.func(); // 호출하여 사용
}
}
🖥️ console 출력 화면
🔈 단발성으로 간편하게 사용하기 위해 객체 생성과 동시에 메소드 구현>호출 하여 사용하는 것 이다.
📖 익명클래스 anonymous class 예제(2)
필드 초기값으로 대입, 지역변수 값으로 대입, 매개값으로 사용 총 세가지 경우를 알아보자
package day15;
class Person{
void wake() {
System.out.println("7시 기상");
}
}
class Anony{
// 초기값으로 대입 : Person 객체 상속받은 자식 클래스를 정의(오버라이딩)+객체 생성해서 대입
Person P = new Person() { // P는 인스턴스 변수, 상속받아서 만듬, 자식 클래스를 단발성으로 만든 것
void work() { // 다이렉트로 볼 수 없다
System.out.println("출근");
}
void wake() {
System.out.println("6시 기상");
work(); // 이안에서 쓸 것을 따로 빼서 작성(길어져서)
}
}; // 여기까지 하나의 명령
// Anony 인스턴스 메소드
void func() {
// 지역변수 값으로 대입
Person localP = new Person() {
void walk() {
System.out.println("산책");
}
@Override
void wake() {
System.out.println("7시에 일어나서");
walk();
}
}; // 확장
// localP는 지역변수이므로 이 메소드 안에서만 유효
localP.wake();
//int a = 10;
//System.out.println(a);
}
void func2(Person person) {
person.wake();
}
}
public class AnonyEx02 {
public static void main(String[] args) {
Person p = new Person();
System.out.println("Person 객체 생성 후 메소드 부르기");
p.wake();
System.out.println("---------------");;
Anony anony = new Anony();
System.out.println("필드 초기값으로 대입");
anony.P.wake();
System.out.println("---------------");
System.out.println("지역 변수값으로 대입");
anony.func();
System.out.println("---------------");
System.out.println("매개값으로 사용");
// Anony 클래스에 있는 func2 사용하면서 매개값으로 던져주는 데 그안에 내용을 단발성으로 수정하여 사용
anony.func2(new Person(){ // 제일 많이 사용
void study() {
System.out.println("공부한다");
}
@Override
void wake() {
System.out.println("9시 기상");
study();
}
});
}
}
🖥️ console 출력 화면
🔈 보면서 이해는 가는데 직접 사용하려고 하면 손이 안움질것 같은 st....
'basic > java 실습' 카테고리의 다른 글
day 12 연습문제(3) - class(지금까지 배운 것 전부 활용)(난이도상) (0) | 2021.05.14 |
---|---|
day 15 예제 및 문제 - 예외처리 Exception handling (0) | 2021.05.13 |
day 14 예제 및 문제- 추상클래스, 인터페이스, 상속 (0) | 2021.05.11 |
day 13 예제 및 문제- 상속과 생성자, 메소드 오버라이딩 (0) | 2021.05.10 |
day 12 연습문제(2) - class(지금까지 배운 것 전부 활용)(난이도중하) (0) | 2021.05.07 |