Java 12일차

21734 단어 JavaJava
  1. StringBuilder 클래스
  2. 중첩 클래스
  3. Thread

StringBuilder 클래스(가변 객체)

StringBuilder 참조변수 = new StringBuilder("문자열");

  • String 클래스와 같이 문자열을 다루는 클래스
  • String 클래스는 문자열을 인스턴스로 생성하고 나면 인스턴스가 가진 문자열을 변경하지 못하는 단점을 보완한 클래스
  • 같은 인스턴스 안의 문자열 필드 값을 추가하거나 변경할 수 있도록 되어 있음
  • 원본 문자열을 바꿀 수 있는 만큼 문자열을 다루는 메소드도 많이 포함

중첩 클래스

  1. 내부 클래스(Inner class)
    • 클래스 또는 메소드 안에 또 다른 클래스를 만드는 것
    • 내부 클래스는 외부 클래스의 모든 멤버를 자신의 멤버처럼 사용(private 멤버 접근 가능)
    • static 내부 클래스를 제외한 내부 클래스는 항상 외부 클래스 객체를 통해서 생성
class Outer{
    private int num1 = 10;
    public  void method1(){
        System.out.println("num1 : " + num1);
    }

    public void printInner(){
        Inner inner = new Inner();
        inner.method2();
    }

    class Inner { // Inner class : 클래스 안에 클래스
        private int num2 = 20;
        public void method2(){
            System.out.println("Inner.num1 : " + num1);
            System.out.println("Inner.num2 : " + num2);
        }
    }
}

public class InnerClass1 {
    public static void main(String[] args) {
        Outer outer = new Outer();
        outer.method1();

        Outer.Inner inner = outer.new Inner(); // 바깥쪽 클래스가 존재해야 이게 생성될 수 있다.
        inner.method2();

        outer.printInner();
    }
}

  1. 로컬 클래스(Local class)
    • 메소드 안에서 정의된 클래스(메소드 안에서만 사용할 수 있음)
    • 외부 클래스의 모든 멤버에 접근 가능(Private 멤버도 접근 가능)
    • 지역 변수는 접근할 수 없지만, final로 선언된 상수는 접근 가능
/*
    로컬 클래스 예제
 */
public class LocalClass1 {
    private int num1 = 10;

    public void method1(){
        int num2 = 30;

        class Local {
            private int num3 = 30;
            public void method2(){
                System.out.println("num1 : " + num1);
                System.out.println("num2 : " + num2);
                System.out.println("num3 : " + num3);
            }
        }
        Local local = new Local();
        local.method2();
    }

    public static void main(String[] args) {
        LocalClass1 localClass1 = new LocalClass1(); // 객체 생성
        localClass1.method1();
    }
}

  1. static 클래스(static class)
    • 내부 클래스가 static으로 정의
    • 정적 중첩 클래스 또는 static 클래스라고 부름
/*
    static 클래스 예제
 */
public class StaticClass1 {
    static class  Cal{
        int num = 0;
        public void plus(){
            num++;
        }
    }

    public static void main(String[] args) {
        StaticClass1.Cal cal = new StaticClass1.Cal();
        cal.plus();
        System.out.println(cal.num);
    }
}
  1. 익명 클래스(anonymous class)
    • 클래스를 정의하지 않고 객체를 정의할 때 사용
    • 1회용 클래스이므로 재활용이 불가능
interface Inter1{ // 인터페이스는 뭔가 만들기 위해 틀을 설계 해놓은것
    void method1();
}

class TestClass1 implements Inter1{
    @Override
    public void method1() {
        System.out.println("Inter1을 구현한 클래스"); // 오버라이드를 시켜 구현을 해줌
    }
}

interface Inter2{
    String method2(); // 추상메소드가 반환형이 String 이름이 메소드
}

class TestClass2 implements Inter2{
    @Override
    public String method2() {
        return "실명 클래스!"; // 일반적으로 쓸때 TestClass2를 쓸때 메소드 리턴
    }
}

class  TestClass3{
    public void method3(Inter2 inter2){ // 매개변수가 Inter2라는 타입으로 객체를 넣어줘야 한다.
        System.out.println(inter2.method2()); // 오버라이드된 메소드 사용
    }
}
public class Anonumous2 {
    public static void main(String[] args) {
        TestClass2 testClass2 = new TestClass2();
       TestClass3 testClass3 = new TestClass3(); // 객체 생성
       testClass3.method3(testClass2); // 매개변수가 무조건 inter2타입으로 만들어진 객체가 필요.
        // 이게 지금까지 배웠던 일반적인 방법

       // 익명 클래스 시작!(아주 아주 중요)→ 이거 모르면 자바 모르는거
       testClass3.method3(new TestClass2(){ // 일회용으로 만들어서 넣어주겟다. 굳히 참조변수만들지 않고 바로 객체를 만들어서 사용
           // Test2사용하려면 inter2가 필요
           @Override
           public String method2() { // 오버라이드를 재구현
               return "익명 객체";
           }
           /*
            왜 이렇게 쓰는가?
            - 꼭 구현해야 하는 인터페이스 메소드를 강제성있게 만들어 놓음.(인터페이스를 구현하도록)
            - 미리 준비되어있으나 비어있다. 채워서 사용
            */
       });
    }
}

Thread

  • 하나의 프로세스 내부에서 독립적으로 실행되는 작업 단위
  • 운영체제에 의해 관리되는 하나의 작업 혹은 Task를 의미
  • JVM에 의해 하나의 프로세스가 발생, main() 안에 실행문들이 하나의 스레드
  • main() 외에 또 다른 스레드를 만들려면 Thread 클래스를 상속하거나 Runnable 인터페이스를 구현함
  • 다중 스레드 작업 시에는 각 스레드끼리 정보를 주고 받을 수 있어 처리 과정의 오류를 줄일 수 있음
  • 프로세스끼리는 정보를 주고 받을 수 있음

멀티 스레딩

  • 여러 스레드를 동시에 실행 시키는 응용 프로그램을 작성하는 기법
  • 메모리 공유로 인한 시스템 자원 소모가 줄어듦
  • 동시에 두가지 이상의 활동이 가능하며, 서로 자원을 소모하다가 충돌이 일어날 가능성이 있다.
  • 코드가 난해해질 가능성이 있다.

Thread의 생성주기

  • Runnable : 스레드가 실행되기 위한 준비 단계
  • Running : 스케줄러에 의해 선택된 스레드가 실행되는 단계
  • Blocked : 스레드가 작업에 완수하지 못하고 잠시 작업을 멈추는 단계

좋은 웹페이지 즐겨찾기