본문 바로가기
언어 공부/Java

[Java] Java의 클래스

by 희조당 2022. 8. 17.
728x90

✍️ 학습할 것

  • 클래스
  • 인스턴스
  • 메서드
  • 생성자
  • this

📌 클래스 (Class)

클래스는 객체 지향 프로그래밍(OOP)에서 사용되는 객체를 정의해놓은 것으로 인스턴스를 생성할 때 쓰인다.

다시 말하면, 객체의 속성과 기능을 하나로 묶어놓은 틀이다. 

Java에서 클래스는 필드, 생성자, 메서드로 구성된다.

  • 필드(속성) : 객체의 데이터를 저장하며 멤버 변수라고도 부른다.
  • 생성자 : 필요한 정보를 인수로 받아 객체를 초기화한 후 반환하는 역할이다. 
  • 메소드 : 객체의 기능이다. 호출 시 정의된 코드를 수행한다.

class 키워드로 클래스를 정의하고 앞에 접근 지정자를 두어 외부에서 접근할 수 있는 범위를 설정한다.

// Example
public class Person {
    // 필드(멤버변수)
    private String name;
    private int age;
	
    // default 생성자, 생략이 가능하지만 매개변수를 가진 생성자가 있으면 반드시 명시해야한다.
    public Person() {
        ...
    } 
    
    // 매개변수를 가진 생성자
    public Person(String name, int age){
        this.name = name;
        this.age = age;
    }
	
    // 메소드
    public String getName(){
        // 메소드 내부 기능
        return name;
    }
}

 

✔️ 접근 지정자

  • 외부에서 클래스 내부 데이터에 손상할 수 없도록 접근 범위를 제한하는 키워드이다.
  • 접근 지정자는 객체지향의 캡슐화와 관련 있다.

Java 접근 지정자

✔️ 클래스 작성 규칙

  • Java 키워드는 사용할 수 없다.
  • 첫 번째 글자는 숫자가 올 수 없다.
  • 하나 이상의 문자로 이뤄져야 한다.
  • $, _ 외의 특수 문자를 사용할 수 없다.

📌 인스턴스

클래스 정의대로 메모리에 생성된 데이터를 의미한다. 즉, 클래스라는 틀로 찍어낸 것이 인스턴스다.

속성(멤버 변수)과 메서드(함수)를 가진다.

와플 기계와 와플의 관계와 비슷하다!

✔️ new()

  • 정의한 클래스로 인스턴스를 만드는 과정을 클래스의 인스턴스화라고 부른다.
  • Java에서 인스턴스화 할 때 new 키워드를 사용해 생성자를 호출한다.
  • 힙 영역에 메모리를 할당하고 해당 메모리에 대한 주소를 반환한다.
// Example
Person person1 = new Person(); // 기본 생성자
Person person2 = new Person("문희조", 26); // 매개변수를 가지는 생성자
System.out.println(person2.getName()); // 문희조

✔️ 객체 vs 인스턴스

보통 객체와 인스턴스는 같은 말로 많이 쓰인다. 자세히 뭐가 다르고 왜 같은 의미로도 쓰일까?

  • 객체(Object) : 소프트웨어 세계에 구현할 대상
  • 클래스(Calss) : 객체를 구현하기 위한 설계도
  • 인스턴스(Instance) : 설계도로 소프트웨어 세계에 구현된 실체

객체는 소프트웨어적 관점에서 현실의 대상을 사유, 즉 파악한 결과이다.

이 사고의 결과 구현해내는 설계도를 클래스라고 부르고 클래스로 실체화한 결과물이 인스턴스이다.

사실 객체를 인스턴스라고 부르는 건 크게 틀린 말은 아니다. 😋😋 

 

참고 : https://alfredjava.wordpress.com/2008/07/08/class-vs-object-vs-instance/


📌 메서드

객체지향에서 기능을 나타내며, 객체의 어떤 동작을 함수화 한 것이다. 

  • 일반적인 함수의 구현과 같다.
  • 객체지향의 다형성을 살리는 두 가지 기법이 존재한다. 
// Example
public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

✔️ 메서드 오버로딩

  • 같은 이름의 메서드를 정의하는 것이다.
  • 일반적으로 한 클래스 내 같은 이름의 메서드가 둘 이상일 수 없으나, 매개변수의 개수나 타입을 다르게 해서 하나의 이름으로 여러 메서드를 작성할 수 있다.
// Example
public void setUser(String name) {...}
public void setUser(String name, int age) {...}

// 대표적인 메소드 오버로딩
System.out.println("안녕하세요?")
System.out.println(1995)
System.out.println(3.141592F)

✔️ 메소드 오버라이딩

  • 부모 클래스에 정의된 메서드를 자식 클래스에서 재정의하는 것이다.
  • 동작만 재정의하는 것이므로 선언부는 그대로, 내용만 변경 가능하다.
  • 오버라이드 시 @Override 어노테이션으로 표시해준다. 
// Example
class Parent {
    void display() { System.out.println("부모 클래스의 display() 메소드입니다."); }
}

class Child extends Parent {
    @Override
    void display() { System.out.println("자식 클래스의 display() 메소드입니다."); }
    void display(String str) { System.out.println(str); }
}

public class Test {
    public static void main(String[] args) {
        Child ch = new Child();
        ch.display();
        ch.display("오버로딩된 display() 메소드입니다.");
    }
}

예제 실행결과


📌 생성자

객체를 생성하고 초기화하는 메서드이다.

  • private 변수에는 사용자도 프로그램도 접근할 수 없기 때문에 인스턴스를 원하는 값으로 초기화하려면 일반적인 초기화 방법으로는 할 수 없다.
  • private 변수에 접근할 수 있는 초기화만을 위한 public 메서드가 바로 생성자이다.

✔️ 특징

  • 클래스의 이름과 동일하고 리턴 타입이 없다.
  • 생성자가 반드시 존재하고, 한 개 이상의 생성자를 가질 수 있다. (메서드라서 오버로딩이 가능하다.)
  • 매개변수를 가지는 생성자가 있으면 기본 생성자가 자동으로 추가되지 않는다.
// Example
Person() // 기본 생성자, 따로 선언하지 않아도 된다.
Person(String name, int age) { // 매개변수가 있는 생성자, 기본 생성자를 선언해야 한다.
    this.name = name;
    this.age = age;
}

📌 this

자기 자신의 주소를 가리키는 키워드이다.

  • this 키워드를 통해서 인스턴스 변수에 접근할 수 있다.
  • 인스턴스 메서드에서만 사용할 수 있다.

✔️ this()

  • 생성자 내부에서만 사용할 수 있는 메서드이다.
  • 같은 클래스의 다른 생성자를 호출할 때 사용한다.
class Person {
    private String name;
    private int age;
    
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    public Person() {
        this("Hejow", 26);
    }
}

 

'언어 공부 > Java' 카테고리의 다른 글

[Java] Java의 패키지  (0) 2022.09.05
[Java] Java의 상속  (2) 2022.08.25
[Java] Java 제어문  (0) 2022.08.16
[Java] Java의 연산자  (0) 2022.08.15
[Java] Java의 데이터 타입, 변수 그리고 배열  (0) 2022.08.12

댓글