본문 바로가기

자바기반응용프로그래밍

4. 클래스와 상속(1)

이번 시간에는 클래스와 생성자에 대해 학습했다.

 

  • 객체
  1. 캡슐화
  2. 상속
  3. 다형성

-캡슐화 : 내부를 볼 수 없게 하다

 

             ---- 객체의 본질적인 특징이다.

             ---- 사용자가 사용 원리를 몰라도 된다.

            

            클래스 => 객체의 틀 (메소드와 필드를 클래스 내부에 구현)

            

            객체: 실체 (인스턴스 라고도 한다.)

                     객체가 생성되다 => new 키워드로 인스턴화 하다

                     접근 제한이 가능하다.

 

-상속 : 재활용하다

           

           ---- 수퍼 클래스 (부모 클래스) / 서브 클래스 (자식 클래스)

                 속성을 물려받고 기능을 확장 (extends)

                 == 서브 클래스 객체는 슈퍼 클래스의 멤버와 서브 클래스의 멤버를 모두 가진다.

           

           C++과 다르게 클래스의 다중 상속이 불가능하다

           인터페이스 다중 상속은 허용

 

-다형성 : 같은 이름의 메소드가 클래스나 객체에 따라 다르게 동작하도록 구현하다

              ex) 메소드 오버로딩

 

객체 지향 언어의 목적 (객체들간의 상호 작용으로 표현)

  1.       상속, 다형성 등 소프트웨어 재사용
  2.       시간 단축 -> 생산성 향상
  • 클래스

우선, 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 클래스를 사용하거나 접근할 수 있음을 선언하는 것

 

  • 생성자와 객체의 생성

- 생성자 : 클래스의 이름과 동일한 메소드

               객체가 생성될 때 자동으로 한 번 호출되는 메소드

               객체가 생성될 때 초기화를 위해 실행되는 메소드

               원래 정해진 값이 아닌 개발자가 원하는 초기화 가능

 

    => 특징 

  1. 오버로딩을 통해 생성자 여러 개 작성 가능
  2. new 키워드를 통해 객체 생성될 때 한 번만 호출
  3. 객체가 생성될 때 반드시 호출됨
  4. 리턴 타입 X
  5. 생성자를 작성하지 않았다면 기본 생성자 대입 

--> 생성자가 하나라도 작성되어 있는 경우, 기본 생성자는 만들어지지 않음

 

-기본 생성자: 매개 변수 없고 아무 작업 없음 단순 리턴

 

<객체의 생성>

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.멤버) 형태

 

-필요성 : 멤버 변수와 메소드의 변수의 이름이 같은 경우

              객체 자신의 레퍼런스 리턴할 때

              다른 메소드 호출 시 객체 자신의 레퍼런스 전달할 때

 

<메소드가 객체 자신의 레퍼런스 반환하는 경우>

person이 Person객체를 가리키는 레퍼런스 변수/생성자에서 person이 가리키는 값 그대로 받은 this가 name과 age를 받음/displayInfo에서 this가 가리키는 객체의 name과 age를 출력한다.

 

  • this()
  1. 클래스 내의 다른 생성자를 호출한다
  2. 생성자 내에서만 사용 가능하다
  3. 생성자 코드의 제일 첫 줄에 수행해야 한다

 

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