티스토리 뷰

PL/JAVA

[JAVA] 자바 - 클래스와 객체

poopooreum 2024. 5. 23. 17:39
반응형

✏️ 객체 지향 언어의 특성

  • 캡슐화(Encapsulation) : 캡슐화란 객체를 캡슐로 싸서 내부를 보호하고 볼 수 없게 하는 것으로, 객체의 가장 본질적인 특징이다. 예를 들어서 설명하자면 캡슐 약을 생각해볼 수 있다. 캡슐에 든 약은 어떤 색인지, 어떤 성분인지 보이지 않으며 외부의 접근으로부터 안전하다. 객체는 캡슐화가 기본 원칙이지만 외부와의 접속을 위해 몇 부분은 공개 노출하고 있다. 이 부분을 위해서 자바에서의 객체는 클래스(CLASS)라는 캡슐을 사용하며 필드(멤버 변수)와 메소드(멤버 함수)로 구성된다.
  • 상속(inheritance) : 우리가 흔히 알고 있는 상속은 상위 개체의 속성이 하위 개체에 물려져서, 하위 개체가 상위 개체의 속성을 모두 가지게 된다. 자바에서의 상속은 자식 클래스가 부모 클래스의 속성을 물려받고 기능을 추가하여 확장(extension)하는 개념이다. 부모 클래스를 super class라 부르고 자식 클래스를 sub class라고 부른다. 상속은 슈퍼 클래스의 필드와 메소드를 물려받아 코드를 재사용함으로써, 코드 작성에 드는 시간과 비용을 줄여준다
  • 다형성(Polymorphism) : 다형성은 같은 이름의 메소드가 클래스 혹은 객체에 따라 다르게 동작하도록 구현하는 것을 뜻한다. 슈퍼 클래스에 구현된 메소드를, 서브 클래스에서 동일한 이름으로 자신의 특징에 맞게 다시 구현하는 것을 메소드 오버라이딩(overriding)라고 불린다. 클래스 내에서 이름이 같지만 서로 다르게 동작하는 메소드를 여러 개 만드는 것을 메소드 오버로딩(overloading)이라고 한다. 이 두 가지는 다형성의 여러 사례들이다.

 

✏️ 객체 지향 프로그래밍 vs 절차 지향 프로그래밍

 

우리가 흔히 아는 C언어나 파이썬은 절차 지향 프로그래밍 방법을 사용한다. 절자 지향 프로그래밍이란, 실행하고자 하는 절차를 지정하고, 그 절차대로 프로그래밍하는 것을 뜻하며 목적을 달성하기 위한 일의 흐름에 중점을 둔다. 그에 반해 겍체 지향 프로그래밍은 실제 세상에 가깝게 프로그램을 모델링하여 객체들의 관계, 상호 작용을 설계한 뒤 각 객체를 클래스로 작성하게 된다.

 

✏️ 클래스

  • 클래스 선언 
  • 필드와 메소드 : 객체 내에 값을 저장할 멤벼 변수를 필드라고 하며 클래스 내에서 만들어지는 함수를 메소드라 한다.
  • 접근 지정자 : 아래 코드에서는 public이 접근 지정자인데, 여기에서는 이런 것이 있다는 정도만 알아가고 다음 게시물에서 설명할 예정이다.
  • 생성자 : 클래스 이름과 동일한 메소드를 생성자(constructor)라고 하며, 객체가 생성될 때 자동으로 호출된다.
public class Grade {
   public int score; // 점수 필드
   public String name; // 이름 필드
   
   public Grade(){ // 생성자
       
   }
   public double getScore(){ // 메소드
       return score;
   }

    public static void main(String[] args) {
        Grade grade; // 클래스 선언
        grade = new Grade(); // 클래스 객체 선언
        
        grade.score = 95; 
        grade.name = "pooreum";
        double score = grade.getScore();
        
    }
}

객체 멤버에 접근하기 위에서는 위의 코드처럼 레퍼런스 변수(grade)뒤에 점(.) 연산자를 붙여서 사용할 수 있다.

 

 

✏️ 생성자

  • 생성자의 이름은 반드시 클래스 이름과 동일해야 한다.
  • 생성자는 여러 개 작성(오버로딩)할 수 있다.
  • 생성자는 new를 통해 객체 생성할 때 한 번만 호출된다.
  • 생성자에 리턴 타입을 지정할 수 없다, 단 return은 붙여도 상관없다
  • 생성자의 목적은 객체가 생성될 때, 필요한 초기 작업을 위함이다.
package ex;
// 오버로딩 사례
public class Poo {
    String name;
    int age;
    
    public Poo(String s){ // 생성자
        name=s;
    }
    
    public Poo(int n, String s){ // 생성자, 리턴타입이 지정되어 있지 않다
        name=s;
        age=n;
    }

    public static void main(String[] args) {
        Poo p;
        p = new Poo("pooreum");
        Poo p1;
        p1 = new Poo(23,"pooreum");
        System.out.println(p.name);
        System.out.println(p1.name +" "+p1.age);
    }
}

 

 

✏️ 기본 생성자

기본 생성자는 매개변수와 실행 코드가 없어 아무 일도 하지 않고 단순 리턴하는 생성자이다. 디폴트 생성자라고도 부른다.

Class pooreum{
	public pooreum(){}
}

 

생성자가 없는 클래스는 있을 수 없는데, 생성자가 없게 되면 컴파일 오류가 나게 된다. 따라서 코드에서 생성자가 없는 경우 컴파일러는 기본 생성자를 자동으로 생성하게 된다.

public class Poo {
    String name;
    int age;
    
    // public Poo(){} 컴파일러가 자동으로 생성해 주었다고 생각하기
    public static void main(String[] args) {
        Poo p;
        p = new Poo();
    }
}

 

그러나 만약 생성자가 하나라도 존재한 상태(기본 생성자가 아닌 경우)라면 컴파일러는 기본 생성자를 자동으로 삽입해 주지 않게 되고 기본 생성자를 호출할 수가 없다. 아래 사진과 같이 컴파일 오류가 난다.

 

 

✏️ this 레퍼런스

this는 자바의 중요한 키워드로 객체 자신을 가리키는 레퍼런스이다. 즉 현재 객체 자신에 대한 레퍼런스이고 조금 더 정확한 말로는 현재 실행되는 메소드가 속한 객체에 대한 레퍼런스이다. this는 컴파일러에 의해 자동으로 관리되어 있기 때문에 개발자는 this를 사용하기만 하면 된다. 매개변수의 중요도와 객체 자신의 레퍼런스를 리턴할 때 주로 사용한다.

public class Poo {
    String name;
    int age;

    public Poo(int age, String name){
        this.age=age;
        this.name=name;
        name= name; // 이 코드는 객체 p의 name필드에 메인 함수에서 넘겨 받은 인자 name를 넣는 것이 아니다.
    }

    public Poo getMe(){
        return this;
    }
    
    public static void main(String[] args) {
        Poo p1;
        p1 = new Poo(23,"pooreum");
        System.out.println(p1.name +" "+p1.age);
    }
}

 

 

✏️ this()

this()는 클래스 내에서 생성자가 다른 생성자를 호출할 때 사용하는 자바 코드이다. 위에서 언급했던 this하고는 다르니 혼동하지 않도록 주의해야 한다. 또한, 반드시 생성자 코드에서만 호출할 수 있으며 같은 클래스 내 다른 생성자를 호출할 때 사용할 수 있으며 반드시 생성자의 첫 번째 문장에서 사용되어야 한다.

package ex;

public class Poo {
    String name;
    int age;

    void showMyName(){
        System.out.println("name = " + name);
    }
    public Poo(){
        this("");
        System.out.println("생성자 호출");
    }

    public Poo(String name){
        this.name = name;
    }
    public Poo(int age, String name){
        this.age=age;
        this.name=name;
    }


    public static void main(String[] args) {
        Poo p1 = new Poo(23,"pooreum");
        Poo p2 = new Poo();
        Poo p3 = new Poo("poo");
        p3.showMyName();
    }
}

 

 

✏️ 메소드 오버로딩

자바에서는 한 클래스 내에, 이름이 같지만 매개변수의 타입이나 개수가 서로 다른 여러 개의 메소드를 중복 작성할 수 있느데 이를 메소드 오버로딩(method overloading) 또는 메소드 중복이라고 부른다. 위에서 한 클래스 내에 여러 개의 생성자를 중복 작성하였는데, 이것도 메소드 오버로딩이다. 메소드가 오버로딩되기 위한 조건으로는 메소드 이름이 동일해야 하며 매개변수의 개수나 타입이 서로 달라야 한다. 단, 메소드의 리턴 타입과 접근 지정자는 메소드 오버로딩과 관계없다.

// 메소드 오버로딩 성공
public class Poo {
    String name;
    int age;
    public Poo(){
        System.out.println("생성자 호출");
    }
    
    public int getAge(int i,int j){
        return  i+j;
    }

    public int getAge(int i,int j,int k) {
        return i+j+k;
    }
}
// 메소드 오버로딩 실패 사례
public class Poo {
    String name;
    int age;
    public Poo(){
        System.out.println("생성자 호출");
    }

    public int getAge(int i,int j){
        return  i+j;
    }

    public int getAge(int i,int j) {
        return i*j;
    }
}

 

 

✏️ 객체 소멸

자바에서는 객체를 생성하는 new연산자는 있지만 객체를 소멸시키는 연산자는 없기 때문에 개발자가 마음대로 객체를 소멸시킬 수 없다. 객체 소멸이란 new에 의해 생성된 객체 공간을 자바 가상 기계에게 돌려주어 가용 메모리(availabe memory)에 포함시키는 것이다. 이를 통해 개발자는 할당받은 메모리를 반환해야 하는 부담이 사라진다. new로 할당받은 후 사용하지 않게 된 객체 메모리는 가비지(garbage)라고 부르며, 자바 가상 기계의 가비지 컬렉터(garbage collector)가 적절한 시점에 자동으로 수집하여 가용 메모리에 반환시킨다.

 

 

✏️ 가비지

가비지(garbage)란 자바 응용프로그램에서 더 이상 사용하지 않게 된 객체나 배열 메모리이다. 다음은 가비지가 발생하게 되는 예시 사례이다. 맨처음에는 a와 b가 각각 Person객체를 가리키지만 b=a를 통해 b는 a가 가리키던 객체를 가리키게 되고 기존에 b가 가리키던 객체는 아무도 참조하지 않아 가리킬 수 없게 된다. 이 객체가 바로 가비지이다.

a = new Person("이순신");
b = new Person("세종대왕");
b=a;

 

 

✏️ 가비지 컬렉션

가비지는 더 이상 참조되지 않기 때문에 가비지가 차지하고 있는 메모리 공간은 회수되어야 한다. 가비지가 많아지면 자바 플랫폼이 응용프로그램에게 할당해줄 수 있는 가용 메모리 양이 줄어들기 때문이다. 시간이 지날수록 자연스럽게 가비지가 늘어나게 되고, 최악의 경우 자바 플랫폼의 가용 메모리가 0이 되면 자바 응용프로그램은 실행이 불가능해진다. 이를 대비하기 위해 자동으로 가비지를 회수하여 가용 메모리는 늘리는데 이를 가비지 컬렉션이라고 부르며, 가비지 컬렉션은 자바 플랫폼에 의해 준비된 가비지 컬렉션 스레드에 의해 처리된다. 이런 특성으로 인해 자바는 큰 프로그램을 실행하다가 가용 메모리가 부족해지는 경우 가비지 컬렉터가 실행되고 응용 프로그램이 실행이 멈추고 가비지 컬렉션이 끝나기를 기다리게 되어 사용자가 보기에는 프로그램이 중단된 것처럼 보이는 경우가 발생하는데, 이런 이유로 자바는 실시간 처리 응용에는 부적합한 것으로 알려져 있다.

System.gc //사용자가 가비지 컬렉션을 강제로 요청할 수 있는 방법이다. 다만 바로 실행되는 것은 아니고 가비지 컬렉션이 필요하다는 요청이여서 자바 플랫폼이 전적으로 판단하여 알아서 실행시킨다.

 

 

✏️ 접근 지정자

자바에서는 총 4가지의 접근 지정자가 있다. public, protected, private, 디폴트가 있으며 각각 접근 정도가 달라진다.

공개 범위는 private -> default -> protected -> public 순으로 넓어지게 된다. 여기서 특이한 것은 protected 접근 지정자인데, 상속을 받은 자식 클래스가 다른 패키지에 있더라도 접근이 가능하게 된다.

멤버에 접근하는 클래스 멤버의 접근 지정자
private default protected public
같은 패키지의 클래스 X O O O
다른 패키지의 클래스 X X X O
접근 가능 영역 같은 클래스 내 동일 패키지 내 동일 패키지와 자식 클래스 모든 클래스

 

 

✏️ static 멤버와 non-static 멤버


non-static 멤버 static 멤버
선언 Class Sample{
int n;
void g(){..}
}
Class Sample{
static int n;
static void g(){..}
}
공간적 특성 멤버는 객체마다 존재
인스턴스 멤버라고 불림
멤버는 클래스마다 존재
멤버는 객체 내부가 아닌 별도의 공간에 생성
클래스 멤버라고 불림
시간적 특성 객체 생성 시에 멤버 생성
객체가 생길 때 멤버도 생성
객체 생성 후 멤버 사용 가능
객체가 사라지면 멤버도 사라짐
클래스 로딩 시에 멤버 생성
객체가 생기기 전에 이미 멤버를 생성
객체가 생기기 전에도 멤버 사용 가능
객체가 사라져도 멤버는 사라지지 않음
멤버는 프로그램이 종료될 때 사라짐
공유의 특성 공유되지 않고, 멤버는 객체 내에 각각 공간을 유지 동일한 클래스의 모든 객체들에 의해 공유됨

 

 

✏️ static 멤버의 제약 조건

  • static 멤버는 클래스가 로딩되는 시점에 생성되어 클래스.static필드 또는 클래스.static메소드로 접근할 수 있다.
  • non-static 멤버처럼 객체.static필드 or 객체.static메소드로 접근할 수 있다.
  • static 메소드는 static멤버만 사용할 수 있으며 non-static멤버를 사용할 수 없다.
  • static 메소드는 객체 없이도 존재하기 때문에 this를 사용할 수 없다.

※ 자바에서는 캡슐화의 원칙으로 인하여 전역 변수를 선언할 수 없는데 static을 통해 전역 함수전역 변수의 역할을 대신해줄 수 있고 대표적인 클래스로 java.lang.Math 클래스가 있다.

 

 

✏️ final

  • final 클래스 : final이 클래스 이름 앞에 사용되면 클래스를 상속받을 수 없다.
  • final 메소드 : final이 메소드를 선언하면 오버라이딩을 할 수 없게 된다.
  • final 필드 : final로 필드를 지정하면 상수가 되고, 상수는 한 번 초기화하면 값을 변경할 수 없는 특징을 지닌다.
반응형

'PL > JAVA' 카테고리의 다른 글

[JAVA] 자바 - 상속 2  (0) 2024.05.26
[JAVA] 자바 - 상속  (0) 2024.05.25
[JAVA] 자바 - 배열와 예외 처리  (0) 2024.05.22
[JAVA] 자바 - 기본 프로그래밍  (0) 2024.05.22
[JAVA] 자바 - 자바 시작  (0) 2024.05.21
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함