일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- B+TREE
- Blue-Green
- 주간회고
- 메서드명
- useQuery
- 도커
- java
- 월간회고
- 블로그 병행
- 계층별 구조
- 백기선 스터디
- 기능별 구조
- 회고
- N+1
- useMutation
- 멀티쓰레드 프로그래밍
- ci/cd
- 프리코스
- db
- 카카오 2차 코딩테스트
- 우테코
- DeleteAll
- jacoco
- SQL 실행순서
- 클래스
- mysql
- Jenkins
- 어댑티브 해시 인덱스
- InnoDB 버퍼 풀
- BalancedTree
- Today
- Total
Haneul's Blog
[Java] 클래스 본문
목표 [백기선 자바 스터디 5주차]
자바의 Class에 대해 학습하세요.
학습할 것
- 클래스 정의하는 방법
- 객체 만드는 방법 (new 키워드 이해하기)
- 메서드 정의하는 방법
- 생성자 정의하는 방법
- this 키워드 이해하기
클래스를 정의하는 방법
Java는 대표적인 객체지향 언어이고 객체 부분을 만들어 내기 위한 틀(설계도)을 클래스라고 하고 객체의 상태를 나타내는 필드, 객체의 메시지(행동)을 나타내는 메서드로 구성되어 있습니다.
어떻게 구성되어 있고 정의가 무엇인지 알아보았지만 어떻게 정의 할 수 있는지는 말로만 해서 설명이 힘들 것 같아 클래스를 정의하기 위한 방법은 아래의 Phone 클래스 예시와 밑의 설명을 보면 좋을 것 같습니다.
public class Phone {
private String name; // 이름
private String kind; // 기종
private String company; // 만든 회사
private int phoneNumber;
public Phone(String name, String kind, String company, int phoneNumber) {
this.name = name;
this.kind = kind;
this.company = company;
this.phoneNumber = phoneNumber;
}
public void call(String phoneNumber) {
System.out.println(phoneNumber + "로 전화걸기");
}
}
위의 예시인 Phone 클래스는 휴대폰은 이름, 기종, 만든 회사, 번호와 같은 속성을 가지며 call()이라는 메서드를 통해서 전화를 걸 수 있도록 했습니다. 생성자를 통해서 name, kind, company, phoneNumber의 상태값들을 초기화 시켜주어야 하며 call() 메서드를 통해서 전화를 걸 수 있습니다.
또한 예시에서 보면 private이나 public과 정체를 알 수 없는 것들이 필드나 메서드의 가장 앞에 붙어 있는 것을 볼 수 있는데, 이를 접근 제한자라고 하며 필드나 메서드를 정의할 경우 어디까지 여기에 접근할 수 있게 할 것인지를 정할 수 있게 해주는 것입니다.
종류는 총 4가지가 있고 각각의 역할은 아래 부분에 간단하게 정리하였습니다.
접근 제한자
- public : 어디서든 접근 가능
- protected : 상속 받은 클래스나 패키지 내에서 접근 가능
- default : 패키지 내에서 접근 가능
- private : 클래스 내에서만 접근 가능
강하게 제한된 순서는 private → default → protected → public 순입니다.
클래스가 무엇인지와 어떻게 정의하는지 그리고 접근 제한자까지 알아보았지만 객체를 어떻게 만들 것인지는 아직 알 수가 없습니다. 간단하게 결론부터 말씀드리면 new 키워드를 통해 객체를 생성할 수 있는데 자세한 것은 아래에서 다루겠습니다.
객체 만드는 방법(new 키워드 이해하기)
클래스를 정의하였다면 클래스라는 틀로 객체를 찍어내야 합니다. 이러한 과정을 클래스의 인스턴스화라고 하며 new 키워드를 통해 인스턴스화 할 수 있습니다. new 키워드를 이용하면 메모리 힙 영역에 데이터를 저장할 영역을 할당 받은 후 해당 영역의 주소를 객체에게 반환하여 객체를 사용할 수 있도록 해줍니다.
아래는 예시입니다.
//클래스이름 변수명 = new(키워드) 클래스이름(생성자 호출)
// 필드 초기화를 위한 값을 넘겨주면서 객체 생성
Phone phone = new Person("zPlip4", "z4", "samsung", "010-0000-0000");
phone.name // "zPlip4"
메서드 정의하는 방법
메서드는 클래스 내부의 함수를 의미하는데, 입력 값에 따라서 출력값을 만들어 내는 역할을 해줍니다. 그렇다고 모든 메서드가 입력과 출력이 있는 것은 아니고, 4가지 조합이 있을 수 있습니다.
void a(){} // 입출력 모두 없는 경우
void b(int p){} // 입력만 있는 경우
int c(){return 1} // 입력은 없고 출력만 있는 경우
int d(int p){return 2} // 입력과 출력 모두 있는 경우
또한 메서드를 정의할 때 중요한 기법이 있는데 바로 오버로딩과 오버라이딩입니다. 둘 다 다형성을 활용한 코드의 변경과 확장을 위한 것이라는 공통점이 있긴 하지만 둘은 엄연히 다르다고 할 수 있습니다.
메서드 오버로딩
메서드 오버로딩은 파라미터의 갯수나 타입이 다르다면 동일한 이름의 메서드명을 사용하여 메서드를 정의할 수 있게 하는 방법입니다. 하지만 매개변수는 동일하고 리턴 타입이 다른 경우엔 오버로딩이 성립하지 않습니다.
int a(){return 1;}
int a(int b) return b;}
메서드 오버라이딩
메서드 오버라이딩은 상위 클래스가 정의한 메서드를 하위 클래스가 가져와 변경하거나 확장하는 기법, 즉 하위 클래스에서 메서드를 재정의하는 것입니다.
class Phone{
public int a(){return 1;};
}
class IPhone extends Phone{
@Override
public int a() {return 2;} // 메서드 오버라이딩
}
생성자 정의 하는 방법
객체를 생성하려고 한다면 반드시 있어야 하는 것이 있습니다. 바로 생성자라는 것인데 메서드가 아니기 때문에 따로 반환형은 없습니다.(void와 다릅니다.)
생성자는 기본 생성자, 묵시적 생성자, 명시적 생성자로 구분할 수 있습니다.
기본 생성자
클래스 내부에 선언된 생성자가 없는 경우 객체 생성 시에 컴파일러가 자동으로 추가해주는 생성자입니다.
묵시적 생성자
파라미터 값을 가지지 않는 생성자입니다.
명시적 생성자
파라미터 값을 가지는 생성자입니다.
class Phone() {} // 기본 생성자: 생성자를 따로 만들지 않으면 자동으로 생성
class Phone() {
//묵시적 생성자
public Person() {
System.out.println("생성되었습니다.");
}
//명시적 생성자
public Phone(String name){
this.name = name;
}
}
생성자는 객체를 생성하기 위해서 반드시 필요한 존재이기 때문에 아래와 같은 많은 특징들을 가지고 있습니다.
- 리턴 타입을 가지지 않습니다.
- 클래스 이름과 동일합니다.
- 모든 클래스는 생성자가 반드시 존재하고, 한개 이상의 생성자를 가집니다.
- 클래스 내부에 생성자를 선언하지 않으면 컴파일러가 기본 생성자를 선언해 사용합니다.
- 명시적 생성자만 선언되있는 경우 파라미터가 없는 생성자를 사용하고 싶다면 묵시적 생성자를 선언해주어야합니다.
this 키워드 이해하기
this 키워드는 클래스가 인스턴스화 되었을 때 자기 자신의 메모리 주소를 가지고 있습니다. 즉, 자기 자신을 나타내는 키워드라 생각하면 되고, 또한 클래스 내부의 필드 이름과 메서드를 통해 넘어온 파라미터의 변수명이 같은 경우 this 키워드를 통해서 구분해주면 됩니다.
class Phone {
private String name;
public void setName(String name) {
this.name = name;
}
}
또한 this()라는 것이 존재하는데 이는 클래스 내부에서 생성자를 호출하며 생성자가 파라미터가 있을 경우 this() 안에 생성자 파라미터 타입에 맞게 직접 입력하여 사용할 수 있습니다.
'Java' 카테고리의 다른 글
[Java] 패키지 (0) | 2022.10.18 |
---|---|
[Java] 상속 (0) | 2022.10.17 |
[Java] 제어문 (0) | 2022.10.15 |
[Java] 연산자 (1) | 2022.10.13 |
[Java] 자바 데이터 타입, 변수 그리고 배열 (0) | 2022.10.12 |