이번 시간에는 클래스와 생성자에 대해 학습했다.
- 객체
- 캡슐화
- 상속
- 다형성
-캡슐화 : 내부를 볼 수 없게 하다
---- 객체의 본질적인 특징이다.
---- 사용자가 사용 원리를 몰라도 된다.
클래스 => 객체의 틀 (메소드와 필드를 클래스 내부에 구현)
객체: 실체 (인스턴스 라고도 한다.)
객체가 생성되다 => new 키워드로 인스턴화 하다
접근 제한이 가능하다.
-상속 : 재활용하다
---- 수퍼 클래스 (부모 클래스) / 서브 클래스 (자식 클래스)
속성을 물려받고 기능을 확장 (extends)
== 서브 클래스 객체는 슈퍼 클래스의 멤버와 서브 클래스의 멤버를 모두 가진다.
C++과 다르게 클래스의 다중 상속이 불가능하다
인터페이스 다중 상속은 허용
-다형성 : 같은 이름의 메소드가 클래스나 객체에 따라 다르게 동작하도록 구현하다
ex) 메소드 오버로딩
객체 지향 언어의 목적 (객체들간의 상호 작용으로 표현)
- 상속, 다형성 등 소프트웨어 재사용
- 시간 단축 -> 생산성 향상
- 클래스
우선, public 클래스의 이름은 파일 이름과 같아야 한다.
public class Circle{
public int radius; //반지름 필드
public String name; //이름 필드
//public => 우선 default 접근 제한자보다 범위가 넓다고만 생각하기
public Circle(){ //리턴형이 없는 메소드이다.
} //생성자 메소드
public double getArea(){
return 3.14*radius*radius;
}
}
접근 지정자 종류로는 default, public, private 이 있다.
public을 사용하면 다른 클래스에서 Circle 클래스를 사용하거나 접근할 수 있음을 선언하는 것
- 생성자와 객체의 생성
- 생성자 : 클래스의 이름과 동일한 메소드
객체가 생성될 때 자동으로 한 번 호출되는 메소드
객체가 생성될 때 초기화를 위해 실행되는 메소드
원래 정해진 값이 아닌 개발자가 원하는 초기화 가능
=> 특징
- 오버로딩을 통해 생성자 여러 개 작성 가능
- new 키워드를 통해 객체 생성될 때 한 번만 호출
- 객체가 생성될 때 반드시 호출됨
- 리턴 타입 X
- 생성자를 작성하지 않았다면 기본 생성자 대입
--> 생성자가 하나라도 작성되어 있는 경우, 기본 생성자는 만들어지지 않음
-기본 생성자: 매개 변수 없고 아무 작업 없음 단순 리턴
<객체의 생성>
Circle pizza; // 레퍼런스 변수 (레퍼런스 값을 가짐)
//pizza라는 변수가 가리키게 될 객체가 Circle로 만든 객체이구나!
pizza = new Circle(); //객체 생성 / Circle 클래스 타입 크기의 메모리 할당
//생성될 때 생성자 코드 실행
//위에서 선언한 클래스 보면 생성자에 어떠한 행동도 없음
//따라서 필드가 비어있는 상태
pizza.radius = 10;
pizza.name = "자바피자";
//점 연산자 이용하여 값 변경
<생성자 활용>
public class Book{
String title;
String author;
public Book(String t){
title = t;
author = "작자미상";
}
public Book(String t, String a){
title = t;
author = a;
}
public static void main(String args[]){
Book littlePrince = new Book("어린왕자", "생택쥐페리"); //매개변수가 2개인 생성자로 간다
Book loveStory = new Book("춘향전"); //메소드 오버로딩
System.out.println(littlePrince.title + "" + littlePrince.author);
System.out.println(loveStory.title + "" + loveStory.author);
}
}
//출력:
//어린왕자 생택쥐페리
//춘향전 작자미상
- this레퍼런스
객체 자신에 대한 레퍼런스 / (this.멤버) 형태
-필요성 : 멤버 변수와 메소드의 변수의 이름이 같은 경우
객체 자신의 레퍼런스 리턴할 때
다른 메소드 호출 시 객체 자신의 레퍼런스 전달할 때
<메소드가 객체 자신의 레퍼런스 반환하는 경우>
- this()
- 클래스 내의 다른 생성자를 호출한다
- 생성자 내에서만 사용 가능하다
- 생성자 코드의 제일 첫 줄에 수행해야 한다
this(title, "작자미상") 에서 매개변수가 2개인 다른 생성자가 호출되었다.
new Book() 객체 생성될 때 생성자가 호출되었다.
- 객체 배열
객체 / 배열 로 생각해보기
Circle[] c; //레퍼런스 변수 C
c = new Circle[5]; //레퍼런수 변수 5개
for(int i=0;i<c.length;i++){
c[i] = new Circle(i); // 각 원소에 객체 생성
}
//객체 배열은 new 2번
- 인자 전달
- 기본 타입 값 전달(int, float 등)
- 객체 혹은 배열 전달 --> 객체나 배열이 복사되는 게 아니다! / 레퍼런스만 전달 (객체를 찾을 수 있는 경로를 전달)
public class ReferencePassing{
public static void main(String args[]){
Circle pizza = new Circle(10);
increase(pizza); //레퍼런스 값 전달
System.out.println(pizza.radius);
}
static void increase(Circle m){ //레퍼런스값이 가리키는 객체에서
m.radius++; //해당 작업 수행
}
}
- 메소드 오버로딩
매개변수의 개수나 타입이 서로 다르지만, 이름은 동일한 메소드들
리턴 타입은 관련 없다!!
- 객체 소멸과 가비지 컬렉션
자바에서는 임의로 객체를 소멸할 수 없다. JVM이 알아서 한다.
가비지 : 자신을 가리키는 레퍼런스가 없는 객체
Person a, b;
a = new Person("이몽룡");
b = new Person("성춘향");
b = a; //b를 가리키는 레퍼런스 없음 -> 가비지가 되.
이런 가비지를 JVM이 모은 것이 가비지 컬렉션이다.
개발자에 의해 System.gc(); 로 요청될 수 있으나 이것은 권유 같은 느낌이다.
JVM이 전적으로 판단하여 작동을 결정한다.
다른 객체 지향 언어를 배우니 객체나 클래스에 대한 개념이 또 새롭게 느껴진다.
실습 후에 배우는 객체 지향 관련 개념을 정리해서 올려야겠다.
'자바기반응용프로그래밍' 카테고리의 다른 글
5. 클래스와 상속(2) (0) | 2025.09.30 |
---|---|
3. 자바 문법 (2) (0) | 2025.09.17 |
2. 자바 문법 (1) (1) | 2025.09.12 |
1. 자바 입문 (0) | 2025.09.12 |