자바 기본 복습 5. 클래스

장난·2021년 5월 17일
0

자바 기본

목록 보기
5/15
post-thumbnail

5주차 과제: 클래스


📜 시작에 앞서

  • 백기선 님의 라이브 스터디(2020년 11월부터 2021년 3월까지) 커리큘럼을 따라 진행한 학습입니다
  • 뒤늦게 알게 되어 스터디 참여는 못했지만 남아있는 스터디 깃허브 주소유튜브 영상을 참고했습니다

📌 목표

자바의 Class에 대해 학습하세요.


📌 학습할 것

  • 클래스 정의하는 방법
  • 객체 만드는 방법 (new 키워드 이해하기)
  • 메소드 정의하는 방법
  • 생성자 정의하는 방법
  • this 키워드 이해하기

📑 클래스 정의하는 방법


클래스 정의

public class ClassName{	// public class <ClassName>에서 <ClassName>은 소스파일 이름과 일치
    					// 소스파일에 1개만 가능
    /*
    객체간 역할과 책입, 협력에 따라 객체를 추상화...
    멤버변수
    생성자
    메서드
    */
}

class ClassName2{	// 접근 제어자가 package-private(default)일 경우 public class 외 여러개 가능
			// 컴파일 시 각 클래스파일이 따로 생성
    
}
  • 멤버변수에 대해서는 "자바 기본 복습 2"의 변수 선언 및 초기화하는 방법, 변수의 스코프와 라이프타임 참고
  • 생성자, 메서드는 이후 내용
  • 톱레벨 클래스(중첩 클래스와 달리 가장 바깥의 클래스)는 접근제어자 public, package-private만 가능
    • public : 공개 API가 되며, 클라이언트를 위해 하위 호환 관리 필요
    • package-private : 해당 패키지 내에서만 사용하므로, 클라이언트와 관계 없이 얼마든 작업 가능

중첩 클래스

  • 클래스 내부에 존재하는 클래스
  • 두 클래스가 서로 긴밀한 관계일 때 사용 고려(특히 사용 특정 클래스의 사용 범위가 한 클래스 범위뿐 일때)
  • 장점

    • 내부 클래스에서 외부 클래스에 쉽게 접근할 수 있다

    • 외부 클래스 바깥으로는 내부 클래스를 감춰 캡슐화

nested class

public class OuterClass {
    
    ...

    class InnerClass {
        ...
    }

    static class StaticNestedClass {
        ...
    }

    void method() {
        class LocalInnerClass {
            ...
        }
        ...
    }

    OuterClass anonymousClass = new OuterClass() {
        ...
    };

}
/*
컴파일 시 생성 파일
OuterClass.class
OuterClass$1.class
OuterClass$1LocalInnerClass.class
OuterClass$InnerClass.class
OuterClass$StaticNestedClass.class
*/
  • 크게 static 제어자를 사용한 정적 중첩 클래스(Static Nested Class)비정적 중첩 클래스(Non-Static Nested Class)로 구분
  • 비정적 중첩 클래스는 정적 내부 클래스와 달리 외부 클래스에 대한 참조를 가지고 있기 때문에 메모리 누수가 발생할 수 있다
  • 중첩 클래스에서 외부 인스턴스에 접근하지 않는다면 정적 중첨 클래스 사용

생성 방법

    //정적 중첩 클래스
    OuterClass.StaticNestedClass.***; // 방식으로 바로 접근 가능
    OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass(); //객체 생성 예
    
    //내부 클래스
    OuterClass outerObject = new OuterClass(); //OuterClass 객체를 생성해야 InnerClass 이용 가능
    OuterClass.InnerClass innerObject = outerObject.new InnerClass();
  • 비정적 중첩 클래스는 다시 내부 클래스, 지역 클래스, 익명 클래스로 구분

    • 지역 클래스: 다른 클래스의 인스턴스 메서드 내부에 선언

    • 익명 클래스: 지역 클래스와 비슷하지만 일회성 객체를 반환하는 표현식으로 작성. 매개변수로도 가능

      • 조상클래스의 이름이나 구현하고자 하는 인터페이스의 이름 사용해서 정의
      • new *ParentClassName*(*constructorArgs*) {*members*}
      • new *InterfaceName*() {*members*}

📑 객체 만드는 방법 (new 키워드 이해하기)

NewClass newClass = new NewClass();
  • 클래스로부터 객체를 만드는 것을 클래스의 인트선스화라 하며, 이렇게 만들어진 객체를 인스턴스라고 한다
  • new 연산자는 힙 영역에 메모리를 할당하고, 그 주소를 반환한다
  • 위 코드는 NewClass 타입의 참조변수 newClass를 선언하고 그 값을 new연산자가 반환한 주소 값으로 초기화한 것이다

이후 내용을 포함한 예제 코드와 이미지

public class MainClass {

    public static void main(String[] args) {
        NewClass newClass1 = new NewClass();
        NewClass newClass2 = new NewClass();

        newClass1.name_referenceType = "newClass1";
        newClass2.name_referenceType = "newClass2";		
        newClass1.primitiveType = 1;
        newClass2.primitiveType = 2;

        newClass1.printInfo();
        newClass2.printInfo();

    }
}

class NewClass {
    String name_referenceType;
    int primitiveType;

    public void printInfo() {

        System.out.println("------" + this.name_referenceType + "------");
        System.out.println(this.name_referenceType + " : " + this);
        System.out.println(this.name_referenceType + ".name_referenceType : " + Integer.toHexString(name_referenceType.hashCode()));
        System.out.println(this.name_referenceType + ".primitiveType : " + primitiveType);

    }
}

/*
실행결과
------newClass1------
newClass1 : week5.NewClass@69222c14
newClass1.name_referenceType : c0b86379
newClass1.primitiveType : 1
------newClass2------
newClass2 : week5.NewClass@606d8acf
newClass2.name_referenceType : c0b8637a
newClass2.primitiveType : 2
/*

class


📑 메소드 정의하는 방법


public int add(int x, int y){	//선언부: 접근제어 지시자, 반환타입, 메서드이름, 매개변수
	//구현부: (지역변수), (구현식), return
}

선언부

  • 접근제어 지시자: 메서드의 사용 범위 제한

  • 반환타입: 메서드 수행 결과 반환할 타입

  • 메서드 시그니처

    • 메서드 이름
    • 매개변수: 메서드 수행을 위해 필요한 값을 명시
      • 참고로 참조형 매개변수를 받는다면 그 주소값을 받게 되고, 공유영역인 힙 영역에 대해 접근해 구현식을 수행한다
    • 메서드 이름이 같아도 매개변수의 개수나 타입이 다르면 오버로딩(overloading)을 통해 다른 구현부를 가진 메서드 정의 가능
    • 리턴 타입

구현부

  • 지역변수: 메서드 내에서 사용할 변수
  • 구현식: 메서드에서 수행할 로직
  • return: 모든 메서드는 구현부에 return 반환값을 포함. 단 멧서드의 반환타입이 viod인 경우 컴파일러가 return;자동으로 추가

static 메서드

  • 메서드도 static 제어자를 사용해 객체 생성하지 않고 사용할 수 있는 메서드를 만들 수 있다
  • static 메서드는 클래스이름.메서드이름(매개변수) 식으로 호출
  • static 키워드가 없는 메서드를 인스턴스 메서드라고 한다

📑 생성자 정의하는 방법


ClassName(){}	//기본 생성자 형식

ClassName(int id, String name){
    this.id = id;
    this.name = name;
}
  • 생성자의 이름클래스 이름과 같다
  • 매개변수를 받을 수 있고, 초기화 작업 등에 이용 가능
  • 여러 생성자를 가질 수 있다 (오버로딩)
    • 매개변수의 개수나 타입이 달라야 한다
  • 클래스에 정의된 생성자가 하나도 없다면 컴파일러가 기본 생성자를 추가한다

📑 this 키워드 이해하기


this

  • 인스턴스 자신을 가리키는 참조변수 (자신의 주소 저장)
  • 모든 생성자와 인스턴스메서드지역변수로 숨겨진 채 존재

this()

  • 생성자에서 같은 클래스의 다른 생성자 호출할 때 사용하는 생성자
  • 기본 생성자 외에도 this(매개변수)를 통해 여러 생성자 사용 가능
  • 생성자 내에서 사용시 첫 줄에서만 호출 가능

0개의 댓글