이번 시간에도 지난번에 이어 java에 대해 배워보았다.
클래스를 만들고 해당 클래스의 필드 생성해보기, 생성자 만들기, 클래스의 메소드 작성해보기,
부모클래스 -> 자식클래스인 상속에 대해 이해하기 등
이번에 배운 지식들도 정리해보는 시간을 갖자!
클래스(class)는 여러개의 필드, 생성자, 메소드가 모인 하나의 큰 개념이라고 볼 수 있다.
예를들어 '사람' 이라는 클래스가 있다면
그 '사람' 이라는 게 갖는 특징(이름, 나이, 성별..)을 필드라 할 수 있고,
그러한 특징들의 형식을 정해주는(이름은 홍길동 처럼, 나이는 23 처럼, 성별은 남자 처럼..)것을 생성자,
그리고 '사람' 클래스가 할 수 있는 행동들(이름 확인, 나이 확인..)을 메소드라고 생각할 수 있다.
public class Saram {
// 필드 작성하기
String name;
int age;
String attribute;
// 생성자 만들기
public Saram(String name, int age, String attribute) {
this.name = name;
this.age = age;
this.attribute = attribute;
}
//메소드 만들기
public String getName() {
return this.name; // 해당 객체의 이름을 메인함수로 보냄
}
public void setName(String name) {
this.name = name; // 받은 인자(이름)을 새로운 이 객체의 이름으로 함
}
public void iamWho() {
System.out.println("나는" + this.name + "입니다.");
}
}
이렇게 '사람' 이라는 클래스에 특징들을 부여했다면 '홍길동' 이라는 객체를 만들어 getName, setName 메소드를 활용해보자
public static void main(String[] args) {
Saram kildong = new Saram("홍길동", 23, "학생"); // kildong 을 새로운 '사람' 클래스로 지정, 각 특성들 값 입력
System.out.println(kildong.getName()); // "홍길동" 출력
kildong.setName("김철수"); // 이름 홍길동 -> 김철수로 변경
System.out.println(kildong.getName()); // 바뀐 이름인 "김철수" 가 출력됨
}
클래스를 이루는 각 구성요소들에 대해서 살펴보았다.
하나의 클래스안에 여러개의 필드가 존재할 수도 있으며, 여러개의 생성자(클래스 오버로딩)가 존재할 수도 있다.
그리고 만약 생성자를 만들 때 이름, 나이, 성별 등 인자를 받지 않는 기본 생성자를 만들 수도 있는데
말 그대로 빈 껍데기라 getName 으로 이름을 불러올 시 null 값이 출력된다.
public Saram() { // 이름, 나이, 특징등 디폴트값 안주기 -> 이름 호출 시 null 출력 , 이러한 기본생성자가 있어야 상속가능
}
public static void main(String[] args) {
Saram mola = new Saram(); // 인자가 없는 클래스 생성
System.out.println(mola.getName()); // null 출력
}
이러한 기본 생성자가 있어야 뒤에서 나올 클래스 '상속' 을 활용할 수 있다.
어떤 한 클래스의 필드, 생성자, 메소드 등등 많은 작업을 거치고 나니
해당 클래스에 또하나의 필드 (특징)을 추가하고싶어질 수도 있다.
예를 들어 '사람' 에 'mbti' 라는 특성을 추가하려면 어떻게 해야할까?
이미 작성한 필드랑 생성자들을 건드리는것보다 새로이 특성인 클래스를 만들어서
이전에 만들어놓은 클래스랑 부모 - 자식 간으로 연결시켜 이전 클래스의 메소드까지 활용할 수 있는데
그걸 클래스 상속이라 한다.
새로운 클래스 파일(MBTI)을 하나 만들고 상속시켜보자
public class MBTI extends Saram { // Saram -> MBTI로 클래스 상속하기 (**부모 클래스에 인자가 없는 기본 생성자가 있어야 함!**)
String mbti; // 상속받는 클래스도 필드 설정해주기
// MBTI 객체 생성, 부모클래스의 생성자도 포함해서 작성해주어야함
public MBTI(String name, int age, String attribute, String mbti) {
this.name = name;
this.age = age;
this.attribute = attribute;
this.mbti = mbti;
}
// 자식 클래스(MBTI)의 고유 메소드
public String getMbti() {
return this.mbti;
}
public void setMbti(String mbti) {
this.mbti = mbti;
}
@Override // Override : 부모 클래스의 메소드를 자식 클래스에서 재정의(다르게 쓰는것)
public void iamWho() {
System.out.println("나는" + this.mbti + "입니다.");
}
public static void main(String[] args) {
MBTI kildong = new MBTI("홍길동", 23, "학생", "ENFP"); // kildong 이라는 새로운 MBTI 객체 생성
System.out.println(kildong.getName()); // 부모 클래스의 메소드도 가져옴 -> "홍길동" 정상적으로 출력
System.out.println(kildong.getMbti()); // 자식 클래스의 메소드 -> "ENFP" 정상적으로 출력
kildong.iamWho(); // "나는 ENFP 입니다" 출력
}
}
MBTI 라는 자식클래스를 생성하여 부모클래스인 Saram 과 extends 로 연동시켜(상속시켜)주고
마찬가지로 MBTI 자식클래스도 필드, 생성자를 만들어 준다. 이때 부모클래스의 생성자도 포함시켜서 작성해주면 된다.
부모클래스의 고유메소드를 자식클래스에서 변형시켜 쓰고싶을때 @Override 라고 표현하며 메소드의 이름은 같지만 내용이 틀리다.
마지막 메인함수부분에서 보면 자식클래스에선 getName 메소드가 없지만 부모클래스의 getName 메소드를 불러와 정상적으로
이름이 출력되는것을 확인할 수 있는데, 이렇듯 상속받은 클래스는 부모클래스의 메소드도 활용할 수 있다.
오늘은 어떻게 보면 java 에서 가장 중요하다고하는 class 와 필드, 생성자, 메소드에 대해서 배웠고
그 심화로 상속 클래스에 대해서도 배웠다.
기존에 파이썬으로 먼저 코딩공부를 접해서 그런가 class 라는 개념이 마냥 생소했었는데, 오늘 배운 내용이
그간 어렴풋이 헤매던 개념을 조금이나마 뚫어준것같다