📌 01. 클래스의 구성요소
클래스란 객체를 정의해 놓은 것이다.
흔히 '객체의 설계도'라고 부른다.
클래스를 사용하는 이유는 여러 종류의 데이터를 한곳에 저장하기 위함이 주이다.
📖 필드(field)
필드는 쉽게 '클래스가 어떤 값을 가질 것인가?'이다.
정의는 '객체의 고유 데이터, 부품 객체, 상태 정보 를 저장하는 곳'이지만
전자의 의미로 이해하는 것이 더 쉽다.
private String id;
private String password;
필드값을 생성하는 코드이다.
자세히 보면 변수타입 앞에 'private'란 글자를 있다.
'private'이 붙는 순간 해당 변수는 그 클래스 내부에서만 접근이 가능하게 된다.
같은 말로 다른 클래스에선 절대 접근이 불가능해진다.
상황에 따라 다르겠지만 대부분의 경우 필드값에는 'private'이 붙는다.
private는 왜 꼭 써야 하는가?
쉽게 생각해서 자료보호의 목적을 가지고 있다.
이렇게 맴버변수에 'private'을 선언하는것을 '캡슐화'라고 부른다.
📖 메소드(method)
메소드는 쉽게 "클래스가 어떤 기능을 가질까?"이다.
메인함수에서 캡슐화가 된 맴버변수를 사용하려면 어떻게 해야할까?
정답은 public 메소드를 사용하는 것이다.
'public'은 'pivate'와 반대로 어느 클래스에서든 자유자제로 접근이 가능하다는 뜻이다.
// 필드값에 값을 저장하는 메소드
public void setId(String userId) {
id = userId;
}
public void setPassword(String userPW) {
password = userPW;
}
// 필드값을 출력하는 메소드
public String getID() {
return id;
}
public String getPW() {
return password;
}
- 메소드의 형태
- 반환타입
- 메소드명
- 매개변수
필드에 값을 저장하는 메소드를 setter라고 한다.
필드에 저장된 것을 반환하는 메소드를 getter라고 한다.
때문에 메소드 이름의 형태가 주로 'set000' 혹은 'get000'가 된다.
메소드이 이름은 어떻게 짓든 코딩하는 사람의 마음이지만 위의 형식은 약속이고 반드시 지키는것이 좋다.
getter & setter 자동생성
getter와 setter 메소드는 자동으로 생성이 가능하다.
상단 메뉴 -> source -> generate getter and setter 를 통하여 자동으로 생성할 수 있다.
이는 코딩의 시간도 줄이고 오류가 날 확률도 줄일 수 있으니 자동생성으로 메소드를 만드는 것이 좋다.
※ 참고로 반환타입이 boolean인 메소드의 경우만 예외로 getter메소드가 'get000'이 아닌 'is000'이 된다.
이는 자동생성될때 자동으로 입력이 되는 것이므로 알아두기만 하면 된다.
(손으로 직접 칠 일이 거의 없다.)
this
쉽게 필드값과 메소드의 매개인수를 구분하기 위해 쓰이는 키워드이다.
// 필드값 생성
private String title;
// setter메소드 생성
public void setTitle(String title) {
this.title = title;
}
만약 위의 상황에서 this가 없다면 어떻게 될까?
3개의 title은 전부 매개변수에서 선언한 title이 되어서 오류가 뜬다.
쉽게 매개변수를 필드값과 다른이름으로 선언하고 this를 쓰지 않을 수 있지만
위의 형식을 지켜주는 것이 좋다.
메소드의 오버로딩
int addition(int a, int b) {
return a + b;
}
double addition(double x, double y) {
return x + y;
}
변수를 선언할때 변수 이름이 같으면 안된다.
하지만 위의 두 메소드를 보면 메소드명이 같다는걸 알 수 있다.
이를 메소드의 오버로딩이라고 한다.
자세히 보면 메소드명은 같지만 매개변수가 다르다.
컴퓨터는 우리가 매소드를 호출할때 매개변수를 전달하게 되고
어떠한 매개변수를 전달하냐에 따라 해당하는 메소드를 호출한다.
이를 함수의 바인딩이라고 한다.
때문에 메소드명은 같아도 매개변수가 다르다면 두 메소드는 완전히 다른 메소드가 된다.
📖 생성자(construct)
생성자는 객체를 생성할때 초기화를 하기 위해 생성되는 함수이다.
형태는 메소드와 비슷하지만 차이점은 필드값을 활용하는 메소드가 아닌 객체를 생성하는 메소드란 것이다.
생성자는 몇가지 특징이 있다.
- 반환타입이 없다.
- 메소드명은 반드시 클래스명과 일치한다.
- 클래스에서 생성자는 반드시 존재해야 한다.
생성자는 크게 두가지 종류가 있다.
디폴트 생성자와 일반 생성자이다.
생성자를 이해하기 위해 객체를 만드는 두가지 방법을 알아보자.
디폴트 생성사
// Book 클래스
public class Book {
// field (값)
private String title;
private String author;
private int price;
// method (기능)
public void setTitle(String title) {
this.title = title;
}
public void setAuthor(String author) {
this.author = author;
}
public void setPrice(int price) {
this.price = price;
}
public String getTitle() {
return title;
}
public String getAuthor() {
return author;
}
public int getPrice() {
return price;
}
}
// Main 클래스
public class MainClass {
public static void main(String[] args) {
Book book = new Book();
book.setTitle("어린왕자");
book.setAuthor("생텍쥐베리");
book.setPrice(10000);
System.out.println("제목: " + book.getTitle());
System.out.println("저자: " + book.getAuthor());
System.out.println("가격: " + book.getPrice());
}
}
[출력]
제목: 어린왕자
저자: 생텍쥐베리
가격: 10000
메인 클래스에서 객체를 생성 후 지금까지 배워왔던 getter 와 setter메소드를 통하여
데이터를 저장하고 출력하였다.
생성자의 3번 특징에 따르면 클래스에서 생성자는 반드시 존재해야 하는데 위 Book클래스에는 생성자가 없다.
사실 생성자가 없는게 아니라 자동으로 생성이 되어있는 것이다.
이를 '디폴트 생성자'라 하고 형태는 아래와 같다.
public Book() {
}
메인 클래스의 'Book book = new Book();' 부분,
정확히는 객체를 생성하는 부분을 수행하기 위해 반드시 필요한 코드이다.
개발자가 클래스에 생성자를 정의하지 않았다는 것은 객체를 디폴트 생성자로 생성한다는 것이고
그는 결국 getter와 setter메소드를 사용하여 필드값을 저장하고 출력한다는 의미이다.
쉽게 디폴트 생성자는 getter / setter메소드와 한 세트라고 봐도 무방하다.
일반 생성자
public class Book {
// field (값)
private String title;
private String author;
private int price;
// constructor(생성자)
public Book(String title, String author, int price) {
this.title = title;
this.author = author;
this.price = price;
}
// method(메소드)
public void info() {
System.out.println("제목: " + title);
System.out.println("저자: " + author);
System.out.println("가격: " + price);
}
}
// Main 클래스
public class MainClass {
public static void main(String[] args) {
Member member = new Member("어린왕자", "생텍쥐베리", 10000);
member.info();
}
}
[출력]
제목: 어린왕자
저자: 생텍쥐베리
가격: 10000
첫 번째 방법과 똑같은 결과가 출력되었다.
자세히 보면 객체를 만드는 방법이 다르다.
Member member = new Member("어린왕자", "생텍쥐베리", 10000);
객체를 생성함과 동시에 초기화를 시켜준다.
생성자의 경우도 디폴트 생성자와 다른데 행태만 다를뿐 생성자의 특징은 전부 성립한다.
둘중 어느 방법을 써야 할까?
실무에서는 1번의 방법을 더 많이 쓴다.
위에서 알 수 있듯 2번의 경우는 매개변수를 전부 전달해야 하기 때문에 모든 필드값을 반드시 사용해야 한다.
상황에 따라 다르겠지만 실무에서 필드값은 그 수가 굉장히 많고 그 필드값이 매번 다 사용되지는 않는다.
그럴 경우 내용이 없는 객체를 생성 후 필요한 메소드만 사용할 수 있는 1번의 방법이 더 유리하기 때문이다.
좋은 코드는 생성자를 디폴트 생성자와 일반 생성자 둘다 만들어주는 것이다.
여기서 실수할 수 있는 것은 디폴트생성자는 안 만들어도 자동으로 만들어지기 때문에
일반 생성자만 만들고 디폴트 생성자는 만들지 않는 경우이다.
디폴트 생성자는 클래스 내부에 생성자가 하나도 없을 시에만 자동으로 생성이 되는 것이지
일반 생성자가 생성이 된 후부턴 디폴트 생성자를 직접 만들어줘야지만
bean을 만들기 위한 두가지 방법을 모두 이용할 수 있다.
'Java > Java Fundamental' 카테고리의 다른 글
Day11_추상과 인터페이스 (0) | 2021.11.01 |
---|---|
Day10_상속 (0) | 2021.10.19 |
Day08_배열 (0) | 2021.10.18 |
Day07_String (0) | 2021.10.18 |
Day06_자바의 날짜 (1) | 2021.10.18 |