이 파트는 개인적인 공부로 인하여 정리했습니다.
클래스
자바에서 클래스란 객체를 정의하는 틀 또는 설계도와 같은 의미로 사용됩니다.
자바에서는 이러한 설계도를 가지고, 여러 객체를 생성하여 사용하는 식으로 프로그래밍을 이어나갑니다.
클래스는 객체의 속성 변수를 나타내는 필드(field)와 객체의 함수를 나타내는 메소드(method) 로 구성되어 있습니다.
필드
클래스의 필드란 클래스에 포함된 변수를 가리킵니다. 클래스 맴버라고도 불리웁니다.
또한 클래스 필드는 선언된 위치와 선언자에 따라 클래스변수, 인스턴스변수, 지역변수로 구분됩니다.
클래스 영역에 위치한 변수 중에서 static 키워드를 가지는 변수를 클래스 변수,
반대로 static 키워드를 가지지 않는 변수를 인스턴스 변수,
메소드나 생성자 블록 내에 위치한 변수를 지역 변수라고 합니다.
클래스 메소드 / 인스턴스 메소드
static 키워드를 가지는 메소드를 클래스 메소드라고 하며,
static 키워드를 가지지 않는 메소드는 인스턴스 메소드 라고 합니다.
클래스 메소드는 클래스 변수와 마찬가지로 인스턴스를 생성하지 않고 바로 사용할 수 있습니다.
클래스 메소드는 static 메소드 내부에서 인스턴스 변수를 사용할 수 없습니다.
메서드 오버로딩, 오버라이딩
메서드 오버로딩
동일한 메서드 이름을 가지면서 메소드 시그니처가 다른 메서드를 뜻하는 것입니다.
메소드 시그니처
메서드를 고유하게 식별할 수 있는 요소이며 메서드의 이름과 매개변수 목록으로 구성됩니다.
매개변수 목록 -> 매개변수의 타입, 순서, 개수
메서드 오버라이딩
상속 관계에 있는 부모 클래스에서 이미 정의된 메소드를 자식 클래스에서 같은 시그니쳐를 갖는 메소드로 재정의 하는 것입니다.
메소드의 동작만을 재정의함으로, 기존 메소드와 완전히 같아야 합니다. ( 리턴값, 매개변수, ... )
class Parent {
void display() {
System.out.println("부모 클래스의 display() 메소드입니다.");
}
}
class Child extends Parent {
int count;
// 오버라이딩(overriding)
void display() {
count++;
System.out.println("자식 클래스의 display() 메소드입니다.");
}
// 오버로딩(overloading)
void display(String str) {
System.out.println(str);
}
void display(int c) {
this.count += c;
System.out.println(count);
}
void display(boolean b) {
if(b == true) {
super.display();
}
}
}
이것이 객체 지향 프로그래밍에서 자주 등장하는 '다형성' 의 특징 중 하나입니다.
생성자
생성자란 객체가 생성될 때 동적으로 인스턴스 변수 초기화를 위해 실행되는 특수한 메소드를 지칭합니다.
우리가 변수를 선언할때 int a = 1 처럼 변수에 값을 초기화 하는 것처럼, 객체를 선언 할때 Car mycar = new Car(값1, 값2) 처럼 클래스에 입력값을 보내 객체의 값을 초기화 해 줄수 있습니다.
특징
- 생성자의 목적은 객체 초기화
- 생성자 이름은 클래스 이름과 반드시 동일
- 생성자는 new 를 통해 객체를 생성할 때, 객체당 한번 호출
- 생성자는 객체가 생성될 때 반드시 호출됨
- 생성자는 리턴 타입을 지정할 수 없음
- 개발자가 생성자를 작성하지 않았으면 컴파일러가 자동으로 기본 생성자 삽입
- 생성자는 여러 개 작성이 가능 ( 오버로딩 )
생성자 오버로딩
생성자도 오버로딩이 가능합니다.
생성자를 오버로딩하게 되면, 하나의 클래스에 여러개의 초기화 입력 항목을 구현할 수 있어서 좀 더 다체로운 객체를 만드는데 도움이 됩니다.
class Student {
public int studentID; //학번
public String studentName; //이름
public String address; //주소
public Student(int id, String name, String address) {
this.studentID = id;
this.studentName = name;
this.address = address;
}
public Student(int id, String name) {
this.studentID = id;
this.studentName = name;
this.address = "대한민국"; // 주소를 정하지 않으면 대한민국 으로 설정
}
public Student(String name) {
this.studentID = 0; // 학번을 정하지 않으면 0으로 설정
this.studentName = name;
this.address = "대한민국"; // 주소를 정하지 않으면 대한민국 으로 설정
}
public Student() {
// 아무것도 입력값이 없다면 디폴트로 설정
this.studentID = 0;
this.studentName = "이름없음";
this.address = "대한민국";
}
}
public class Main {
public static void main(String[] args) {
Student studentPark = new Student(20219712,"박혁거세", "미국");
Student studentKim = new Student(20127721, "김종국");
Student studentJames = new Student("제임스");
Student studentJames = new Student();
// 정의되어 있지 않은 오버로딩 생성자는 호출 할 수 없음
Student studentJeff = new Student(20221024); // 불가능 !!
}
}
패키지
패키지란 관련 있는 클래스 파일(컴파일된 .class) 을 저장하는 디렉터리를 칭합니다.
문서 작업할때 문서 파일들을 폴더를 이용해 디렉토리 구분하여 내용을 정리했듯이 자바의 클래스 파일들을 개발하기 용이하게 구조적으로 정리하는 것으로 동일하게 생각하시면 됩니다.
가장 큰 특징은 유일성을 보장받습니다.
우리는 개발을 하면서 여러가지 형태의 클래스를 만들어 클래스 이름을 명명하고 사용할텐데, 외부 라이브러리를 가져와 사용해야 할때 만일 라이브러리의 클래스명 명사가 겹치면 수정하느라 번거로울수도 있습니다.
따라서 이를 구분시키기 위해 자바에서는 도메인(폴더경로) 를 이용해 같은 클래스 이름이라도 경로가 다르면 완전 다른 파일로 인식합니다.
this 참조 변수
단어 그대로 '클래스 자기 자신'을 뜻하는 말입니다.
this 참조 변수는 해당 인스턴스의 주소를 가리키고 있기 때문에 자기 자신에 접근이 가능합니다.
모든 인스턴스 메소드에는 this 참조 변수가 숨겨진 지역 변수로 존재하고 있어 사용이 가능합니다.
클래스 상속
자바에서의 상속이란, 연관있는 클래스에 대해 공통적인 구성 요소를 정의하고, 이를 대표하는 클래스를 정의하는 것을 말합니다. 상속 기능을 이용하게 되면, 상위 클래스의 특징을 하위클래스에서 상속받아 코드의 중복 제거, 코드 재사용성 증대 효과도 누릴 수 있습니다.
기존에 정의되어 있던 클래스를 부모클래스, 상위클래스, 기초클래스 라고 하며 상속을 통해 새롭게 작성되는 클래스를 자식 클래스 또는 하위 클래스, 파생클래스 라고 합니다.
class Dog {
int teethCount; // 중복된 속성들
int legCount; // 중복된 속성들
int tailCount; // 중복된 속성들
void bark();
}
class Cat {
int teethCount; // 중복된 속성들
int legCount; // 중복된 속성들
int tailCount; // 중복된 속성들
void meow();
}
class Lion {
int teethCount; // 중복된 속성들
int legCount; // 중복된 속성들
int tailCount; // 중복된 속성들
void roar();
}
//---
class Animal {
int teethCount;
int legCount;
int tailCount;
}
class Dog extends Animal { // 상속을 통해 중복 코드를 제거
void bark();
}
class Cat extends Animal { // 상속을 통해 중복 코드를 제거
void meow();
}
class Lion extends Animal { // 상속을 통해 중복 코드를 제거
void roar();
}
클래스 상속의 구조적인 한계 때문에 단 하나의 클래스 상속만 가능합니다.
super 키워드
부모 클래스로부터 상속받은 필드나 메소드를 자식 클래스에서 참조하는 데 사용하는 참조 변수 입니다.
위에서 인스턴스 변수의 이름과 지역 변수의 이름이 같을 경우 인스턴스 변수 앞에 this 키워드를 사용하여 구분할 수 있었습니다. 이와 마찬가지로 부모 클래스의 멤버와 자식 클래스의 멤버 이름이 같을 경우 super 키워드를 사용하여 구별할 수 있습니다.
class Parent {
int a = 10; // 부모 인스턴스 변수
}
class Child extends Parent {
int a = 20; // 자식 인스턴스 변수
void display() {
System.out.println(a); // 자식 인스턴스 변수 a 출력
System.out.println(this.a); // 자식 인스턴스 변수 a 출력
System.out.println(super.a); // 부모 인스턴스 변수 a 출력
}
}
public class Inheritance02 {
public static void main(String[] args) {
Child ch = new Child();
ch.display();
/*
실행 결과 :
20
20
10
*/
}
}
접근제어자
외부로부터 데이터의 보호가 필요하고 사용자가 사용하는데 필요 없는 로직들을 숨기기 위해서 사용됩니다.
이러한 것을 은닉화 / 캡슐화 라고 합니다.
'Java' 카테고리의 다른 글
Java - Abstract (1) | 2024.12.11 |
---|---|
업캐스팅 & 다운캐스팅 (1) | 2024.12.11 |
인터페이스 (0) | 2024.12.10 |
List, ArrayList, LinkedList (2) | 2024.12.10 |
제어자 (1) | 2024.12.04 |