<Java> 클래스

라모스·2021년 8월 26일
1

Java☕

목록 보기
5/14
post-thumbnail

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

학습할 것

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

Intro. 객체지향 프로그래밍(OOP)?

객체들간의 상호 작용으로 표현. 클래스 혹은 객체들의 집합으로 프로그램을 작성하는 방식. 현실 세계의 사물을 객체로 보고, 객체의 속성과 기능을 기반으로 프로그래밍하는 기법. (Object Oriented Programming)

객체 지향의 특성?

  • 추상화: 목적과 관련이 없는 부분을 제거하여 필요한 부분만을 표현하기 위한 개념. 객체들의 공통된 특징을 파악해 정의해 놓은 설계 기법.
  • 캡슐화: 객체를 캡슐로 싸서 내부를 볼 수 없게 하는 것. 객체의 본질적인 특징으로 외부의 접근으로부터 객체를 보호. 외부에 노출할 필요가 없는 정보들을 은닉(정보은닉)
  • 상속: 상위 객체의 속성이 하위 객체에 물려지는 것. 하위 객체가 상위 객체의 속성을 모두 가지는 관계. 자식 클래스가 부모 클래스의 속성을 물려받고 기능을 확장하는 것을 말함. 코드의 중복을 피함으로 생산성 극대화.
  • 다형성: 같은 이름의 메소드를 클래스나 객체에 따라 다르게 동작하도록 구현하는 것. 형태가 같은데 다른 기능을 하는 것.

메소드 오버로딩: 같은 이름이지만 다르게 작동하는 여러 메소드
메소드 오버라이딩: 슈퍼클래스의 메소드를 서브 클래스마다 다르게 구현

1. 클래스 정의하는 방법

  • 클래스: 객체를 만들어내기 위한 설계도 혹은 틀. 객체의 속성과 행동을 포함
  • 객체: 클래스의 모양 그대로 찍어낸 실체. 프로그램 실행 중에 생성되는 실체, 메모리 공간을 갖는 구체적인 실체, 인스턴스(instance)라고도 부름

자바의 클래스는 필드, 생성자, 메소드로 구성된다.

  • 필드(field): 객체 내에 값을 저장하는 멤버 변수
  • 메소드(method): 함수이며 객체의 행동(행위)를 구현
  • 생성자: 클래스의 이름과 동일한 특별한 메소드로 객체가 생성될 때 자동으로 한 번 호출되는 메소드이다. 객체를 초기화하는데 필요한 코드를 생성자 내부에 작성한다.
// 접근지정자 class(키워드) 클래스이름 { }
public class Circle {
    public int radius;  // 원의 반지름 필드
    public String name; // 원의 이름 필드

    public Circle() { }  // 생성자 메소드(default 생성자)
    // 파라미터를 가진 생성자. 파라미터를 가지고 변수를 초기화함.
    public Circle(int radius, String name) {
        this.radius = radius;
        this.name = name;
    }
    public double getArea() {  // 원의 면적 계산 메소드
        return 3.14*radius*radius;
    }
}

자바에서는 클래스를 정의하기위해 class 키워드를 사용하며, 외부 클래스가 해당 클래스에 접근하는 범위를 접근 지정자라 하고 이를 통해 접근을 제한 할 수 있다.

접근지정자클래스 내부동일 패키지하위 클래스그 외 영역
publicoooo
protectedooox
default(기본, 생략가능)ooxx
privateoxxx

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

객체는 반드시 new 키워드를 이용해 생성한다. new 키워드는 객체의 생성자를 호출하는 역할을 하는데, 메모리의 힙 영역에 데이터를 저장할 영역을 할당 받은 후 해당 영역의 주소를 객체에게 반환하여 객체를 사용할 수 있도록 만들어 준다. 이러한 과정을 클래스의 인스턴스화 라고 한다.

// 클래스이름 변수명 = new 클래스이름(생성자 호출)
Circle pizza = new Circle();

Map<String, Integer> map = new HashMap<>();

3. 메소드 정의하는 방법

클래스 내부의 메소드는 접근지정자, 리턴타입, 메소드명, 파라미터로 구성된 정의부와 메소드의 기능을 호출하는 호출부로 구성됨.

// 접근지정자 리턴타입 메소드명(파라미터)
public String getName() {...호출부...}
public void setName(String name) {...}

자바의 객체지향적 특징인 다형성을 이용한 메소드 정의 기법으로 코드의 변경과 확장을 용이하게 해주는 2가지 기법이 있다.

메소드 오버로딩(Method Overloading)

메소드 오버로딩은 파라미터의 개수나 타입이 다르다면, 동일한 이름의 메소드명을 사용해 메소드를 정의할 수 있는 기법이다. 리턴타입은 오버로딩과 관련이 없다.

// 메소드 오버로딩이 성공한 사례
class MethodOverloading {
    public int getSum(int i, int j) {
        return i + j;
    }
    public int getSum(int i, int j, int k) {
        return i + j + k;
    }
    public int getSum(int i, double j) {
        return i + (int)j;
    }
}

// 메소드 오버로딩이 실패한 사례
class MethodOverloadingFail {
    public int getSum(int i, int j) {
        return i + j;
    }
    public double getSum(int i, int j) {
        return (double)(i + j);
    }
}

메소드 오버라이딩(Method Overriding)

메소드 오버라이딩은 상위 클래스가 정의한 메소드를 하위 클래스가 가져와 변경하거나 확장하는 재정의 기법이다. 슈퍼클래스 메소드의 이름, 매개변수 타입 및 개수, 리턴 타입 등 모든 것을 동일하게 작성해야 한다. 프로그램 실행시 결정되는 동적 바인딩이 발생한다.

📌 동적 바인딩: 서브 클래스에 오버라이딩 된 메소드가 무조건 실행되는 동적 바인딩

class Person {
    public void info() {
        System.out.println("사람");
    }
}
class Adult extends Person {
    @Override
    public void info() {
        System.out.println("어른");
    }
}
class Child extends Person {
    @Override
    public void info() {
        System.out.println("어린이");
}

Person person = new Person();
Adult adult = new Adult();
Child child = new Child();
person.info();
adult.info();
child.info();

4. 생성자 정의하는 방법

클래스를 생성하고 객체를 호출할 때 객체를 초기화 하기 위해 사용되는 메소드가 생성자이다.

  • 기본 생성자: 매개 변수 없고 아무 작업 없이 단순 리턴하는 생성자. 디폴트 생성자라고도 하며, 클래스에 생성자가 하나도 선언되지 않은 경우, 컴파일러에 의해 자동으로 삽입된다.
  • 묵시적 생성자: 파라미터 값을 가지지 않는 생성자.
  • 명시적 생성자: 파라미터 값을 가지는 생성자.
class Person() {...} // 기본 생성자 호출
class Person {
    // 묵시적 생성자
    public Person() {
        System.out.println("생성완료");
    }
    // 명시적 생성자
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

생성자의 특징

  • 생성자는 클래스 이름과 동일하다.
  • 생성자는 리턴 타입을 지정할 수 없음
  • 모든 클래스는 생성자가 반드시 존재하고, 한 개 이상의 생성자를 가짐.
  • 생성자의 목적은 객체 초기화
  • 생성자는 new를 통해 객체가 생성될 때, 객체당 한 번만 호출됨
  • 클래스 내부에 생성자를 선언하지 않으면 컴파일러가 자동으로 기본 생성자를 삽입함.
  • 명시적 생성자만 선언되어 있는 경우, 파라미터가 없는 생성자를 사용하고 싶다면 묵시적 생성자를 선언해주어야 함.(생성자가 클래스 내부에 선언되어 있기 때문에 기본 생성자가 생성되지 않음)

5. this 키워드 이해하기

this 키워드는 클래스가 인스턴스화 되었을 때 자기 자신의 메모리 주소를 가지고 있다. 즉 객체 자신에 대한 레퍼런스이다. 컴파일러에 의해 자동으로 관리되며, this.멤버 형태로 멤버를 사용하면 된다.

this의 필요성

  1. 객체의 멤버 변수와 메소드 매개 변수의 이름이 같은 경우 구분하기 위함
  2. 다른 메소드 호출 시 객체 자신의 레퍼런스를 전달할 때
  3. 메소드가 객체 자신의 레퍼런스를 반환할 때
public class Circle {
    int radius;

    public Circle() { radius = 1; }
    public Circle(int radius) {
        this.radius = radius;        // 1)의 경우
    }
    Boolean compare(Circle c) { return c == this; }
    double getArea() {
        if (compare(this)) return 0;   // 2)의 경우
        return 3.14*radius*radius;
    }
    public Circle getMe() { return this; } // 3)의 경우
}

this()

  • 동일한 클래스 내의 다른 생성자를 호출할 때 사용
  • 생성자 내에서만 사용 가능
  • 반드시 생성자 코드의 제일 처음에 수행
public class Book {
    String title;
    String author;
    void show() { System.out.println(title + " " + author); }

    public Book() {
        this("", "");
        System.out.println("생성자 호출됨");
    }

    public Book(String title) {
        this(title, "작자미상");
    }

    public Book(String title, String author) {
        this.title = title;
        this.author = author;
    }

    public static void main(String[] args) {
        Book littlePrince = new Book("어린왕자", "생택쥐페리");
        Book loveStory = new Book("춘향전");
        Book emptyBook = new Book();
    }
}

References

  • 명품 Java Programming
  • Java의 정석 3판
profile
Step by step goes a long way.

0개의 댓글