Java

자바의 신 8장 ~ 9장

아나니리 2020. 3. 11. 22:18

8장 참조 자료형

자바의 자료형

  • 기본 자료형 : byte, short, int, long, float, double, char, boolean
  • 참조 자료형 : 기본자료형 빼고 나머지

내가 만든 클래스도 자료형이다.

내가 만든 자료형(클래스) 사용하기

생성자

클래스를 객체로 만들기 위해 사용한다.

public class ReferenceType {
    // 생성자
    public ReferenceType() {
    }
}

생성자를 호출하면 해당하는 클래스의 객체가 생성됨(ReferenceType이 리턴형으로 생각하면 이름이 없는 메소드가 생성자가 아닐까?)

클래스에 생성자가 없으면 매개변수가 없는 생성자를 만들지 않아도 사용할 수 있다. (기본 생성자)

하나라도 생성자가 있으면 기본 생성자는 만들어지지 않는다.

생성자는 여러 개 만들 수 있지만 관리를 위해서 적당히 만든다.

this

this 예약어는 클래스 내에서 자기 자신을 가리킬 때 사용한다.

public class Student {
    private String name;
    private int age;

    // this 생략가능
       public void printName() {
        System.out.println(this.getName());
    }
    // this 생략가능
    public String getName() {
        return this.name;
    }
}

대부분 this는 생략이 가능하다. 하지만 의도를 명확히 하기 위해서 써주는 게 좋을 때도 있다.

public class ReferenceType {
    private String name;
    private int age;

    // this 생략 불가능
    public void setAge(int age) {
        this.age = age;
    }
}

매개변수로 선언한 변수명과 클래스의 필드명이 같다면 this를 생략할 수 없다.

메소드 overloading

메소드, 변수의 이름은 내 코드를 보는 다른 사람을 위해서나 나중에 스스로 자기 코드를 볼 때를 위해서 의미 있게 짓는 것이 중요하다.

하지만 기능이 같은데 매개변수가 달라서 메소드를 다시 만들어야 한다면 이름을 어떻게 지을까?

자바에서는 이를 위해서 메소드 overloading 지원한다.

public class Adder {
       public int add(int a, int b) {
    }

    public int add(String a, String b) {
    }
}

자바는 메소드 이름이 같아도 매개변수가 다르다면 서로 다른 메소드로 인식하기 때문에 메소드 이름을 같게 지을 수 있다.

return

메소드에서 값을 반환할 때 사용하는 예약어

메소드의 리턴값이 void가 아니라면 반드시 있어야 하는 예약어이다. (예외 던질 때 빼고)

void에서도 return을 사용할 수 있는데 return을 사용하면 메소드가 종료된다.

public class Student {
    private String name;
    private int age;

       public void printAge() {
        if (age >= 30) return;
        System.out.println(this.age);
    }
}

나이가 30을 넘었으면 나이를 출력하지 않고 메소드가 종료된다.

static

static 예약어는 클래스에 묶여있는 무언가를 만들 때 사용한다.

클래스를 객체로 만들지 않아도 사용할 수 있게 하지만 프로그램에서 단 하나만 존재하게 만든다.

객체를 생성해도 static 변수는 하나이기 때문에 객체끼리 같은 값을 공유한다.

static 메소드는 필드 변수를 사용할 때 static 변수만 사용할 수 있다.

pass by value, pass by reference

  • 기본 자료형 : pass by value
  • 참조 자료형 : pass by reference

+++ 얕은 복사(shallow copy) vs 깊은 복사(deep copy)?

가변 인자

두 개의 값을 더하는 가산기를 만들어라
세 개의 값을 더하는 가산기를 만들어라
...
n개의 값을 더하는 가산기를 만들어라

이 요구사항을 만족하기 위해서 n 개의 매소드를 만들어도 되지만 가변 인자를 사용하면 간단하다.

public class Adder {
    public int add(int a, int b) {
    }
    public int add(int a, int b, int b) {
    }
}
public class Adder {
    public int add(int... a) {
    }
}

9장 패키지와 접근 제어자

package

2차원 좌표를 관리하기 위해서 나만의 자료형(클래스)을 만들고 이름을 Point라고 지었다.

내가 모든 기능을 만들 수 없어서 다른 사람이 만든 코드를 사용하기로 했다.

그 사람의 코드에 Point라는 자료형이 있다면 내가 만든 클래스의 이름을 바꿔야 할까? 자바는 이를 위해서 패키지를 사용한다.

import

import java.awt.Paint;

import에 패키지 경로를 따라서 클래스를 적어주면 해당 클래스를 사용할 수 있다.

접근 제어자

  • public : 누구나 접근 가능
  • protected : 같은 패키지 or 상속
  • package-private : 같은 패키지 (아무것도 적지 않았을 때 기본값)
  • private : 해당 클래스 내에서만

접근 제어자는 객체지향 언어의 캡슐화와 관련이 많다. 코드를 짜 보면서 외부로부터 은닉할 것을 생각하면서 접근제어자를 사용해보자. 모든 접근 제어자를 private으로 선언하고 필요에 따라 점자 늘려가 보는 것도 많은 도움이 될 거 같다.