Java - 클래스와 객체

2022. 6. 20. 15:54Java

객체지향 언어 Java
객체란?
  • 우리가 실생활에서 인식할 수 있는 사물의 개념
  • 객체마다 고유한 특성과 행동을 가짐
  • 다른 객체들과 정보를 주고 받는 등, 상호 작용을 하면서 살아감
  • Ex) 테트리스의 각 블록들
  • 한글 프로그램의 메뉴나 버튼 

 

객체의 예시
객체(object) 
- 개

프로퍼티(property)
- dog.name = "짱구"
- dog.age = 5
- dog.weight = 6.3

메소드(method)
- dog.walk()
- dog.sleep()
- dog.sit()
- dog.hand()

 

자바의 객체 지향 특성
  • 캡슐화 : 객체를 캡슐로 감싸 내부를 볼 수 없게 하는 것
    • 객체의 가장 본질적인 특징이며 외부의 접근으로부터 객체를 보호
  • 자바의 캡슐화 
    • 클래스(class) : 객체 모양을 선언한 틀 (캡슐화 하는 틀)
    • 객체 : 생성된 실체(instance)
class Animal { //클래스
	String name;
    int age;
    void eat();
    void sit();
    void sleep();
}

Animal dog = new Animal(); //클래스를 통하여 생성된 실체 = 객체(instance)
  • 상속 
    • 상위 개체의 속성이 하위 개체에 물려짐
    • 하위 개체가 상위 개체의 속성을 모두 가지는 관계
  • 자바의 상속
    • 상위 클래스의 멤버를 하위 클래스가 물려 받음
      • 상위 클래스 : Super Class
      • 하위 클래스 : Sub Class, Super Class의 재사용, 새로운 특성 추가 가능
Human 클래스가 존재한다.
이 클래스는 이름, 나이, 성별 등의 멤버들을 가지고 있다고 가정하자.

Inho라는 Human 클래스를 통해 생성된 객체(instance)는
이름, 나이, 성별의 멤버들을 가지고 있으며 Inho 객체만의 특성인
sleep(), walk(), run() 등의 메소드를 가지고 있다.

 

  • 다형성 : 같은 이름의 메소드가 클래스 혹은 객체에 따라 다르게 구현되는 것
    • 다형성의 사례
      • 메소드 오버로딩 : 한 클래스 내에서 같은 이름이지만 다르게 동작하는 여러 메소드
      • 메소드 오버라이딩 : 슈퍼 클래스의 메소드를 동일한 이름으로 서브 클래스마다 다르게 구현
오버로딩은 같은 이름의 메소드를 여러개 정의하고, 매개변수의 유형과 
개수를 다르게 하여 다양한 유형의 호출에 응답할 수 있게 되는 것
class Ex {
	void talk(){
        System.out.println("안녕");
    }
    
    void talk(String name){
        System.out.println("안녕 " + name);
    }

    void talk(String name, String ex){
        System.out.println("안녕 " + name + ex);
    }
}

오버라이딩은 상속시 상위 클래스가 가지고 있는 메소드 또한 하위 클래스로 상속 되어 사용가능하다.
이 때 하위 클래스에서 그 메소드를 재정의해서 사용할 수 있다.
메소드의 이름이 서로 같고, 매개변수가 같고, 반환형이 같도록 재정의 한 후 상위 클래스의
메소드는 무시하고 하위 클래스의 메소드를 사용하겠다는 것

class Dog {
    String name;
    int age;

    public void info(){
        System.out.println(name + age);
    }
}

class jjangs extends Dog{
    String likefood;

    public void info(){
        System.out.println(likefood);
    }
}

 

 

클래스와 객체
클래스란?
  • 객체의 속성과 행위를 선언
  • 객체의 설계도 혹은 틀
  • 사물의 특성을 소프트웨어적으로 추상화하여 모델링 한 것으로 객체를 만들 수 있는 틀로써 오브젝트의 정적인 상태를 나타냄
  • 가령 이름/몸무게/시력을 각각 배열로 입력 받는다고 가정하자 만약 어떤 사람이 역순으로 이름을 저장하거나 시력을 임의의 순서로 정한다면 문제가 발생하기 때문에 개인별 카드(클래스)를 사람 수만큼 준비하고 시력과 키 등의 데이터를 적어 넣는 것이다.

 

객체란?
  • 클래스의 틀로 찍어낸 실체
    • 프로그램 실행 중 생성되는 실체
    • 메모리 공간을 갖는 구체적인 실체
    • 인스턴스라고 함
사례

클래스 : K3 자동차		객체 : 출고된 실제 K3 n대
클래스 : 노트북		객체 : 내 맥북, 동생 삼성노트북 등..
클래스 : 개		객체 : 말티즈, 푸들
  • 클래스를 통하여 만들어진 객체들은 공통적으로 틀은 똑같지만 구성하는 것이 조금씩 다르다
  • 마치 붕어빵을 찍어내는 틀을 클래스라 가정하면 슈크림 붕어빵, 팥 붕어빵, 초코 붕어빵 등이 객체이다

 

클래스의 구성
  • class 키워드로 선언
  • 멤버 : 클래스 구성 요소
    • 필드와 메소드로 구성 되어 있으며 멤버 변수와 멤버 함수라고 하기도 함
  • 클래스에 대한 public 접근 지정 : 다른 모든 클래스에서 클래스에 대한 사용을 허락
  • 멤버에 대한 public 접근 지정 : 다른 모든 클래스에게 멤버에 대한 접근을 허용

 

생성자
  • 객체가 생성될 때 초기화 목적으로 실행되는 메소드
  • 객체가 생성될 시 자동으로 호출됨
class Dog {
    String name;
    int age;

    public Dog(){ 
        name = "null";
        age = 1;
    }

    public Dog(String name, int age){ //생성자는 리턴 타입 X
        this.name = name;
        this.age = age;
    }
}
  • 생성자의 이름은 클래스 이름과 동일하며
  • 생성자는 여러개 작성이 가능하다
  • 생성자는 객체 생성시 단 1번만 호출 되며 자바에서 객체 생성은 반드시 new연산자로 한다.
  • 생성자는 반환형 지정 불가능
  • 생성자 선언을 하지 않았을 경우에는 따로 생성자를 만들어주지 않아도 디폴트 생성자가 존재한다. 

 

this 레퍼런스
  • 객체 자신에 대한 레퍼런스
    • 컴파일러에 의해 자동 관리, 개발자는 사용하기만 하면 된다.
    • this.멤버 형태로 멤버를 접근할 시 사용한다.

 

객체 배열
  • 객체에 대한 레퍼런스 배열
  • 자바의 객체 배열 만들기 3단계
    • 1. 배열 레퍼런스 변수 선언 
    • 2.레퍼런스 배열 생성
    • 3.배열의 각 원소 객체 생성 
import java.util.Scanner;

class Dog {
    String name;
    int age;

    public Dog(){
        name = "null";
        age = 1;
    }

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

    public String info(){
        return name+age;
    }
}

public class prt1 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        Dog [] dog = new Dog[5]; //레퍼런스 배열 생성, 레퍼런스 변수 선언
        for(int i =0; i<dog.length; i++){
            System.out.print(">>");
            dog[i] = new Dog(scanner.next(), scanner.nextInt()); //객체 생성
            
        }
        for(int i=0; i<dog.length;i++){
            System.out.println((dog[i].info()));
        }
        
        scanner.close();
    }
}

출력 결과
짱구5
초코3
백구6
해피1
바둑이9

 

메소드
  • 메소드는 C/C++의 함수와 동일
  • 자바의 모든 메소드는 반드시 클래스 안에 있어야 함 (캡슐화 원칙)
  • 메소드 형식은 접근지정자 리턴타입 메소드이름(메소드 인자들)로 이루어 져있으며 예시는 아래와 같다
public String info(){
        return name+age;
    }
  • 메소드의 인자를 배열로 지정했을 경우 배열 레퍼런스만 매개변수에 전달 된다.
  • 객체가 전달되는 경우와 동일함

 

객체 소멸
  • new에 의해 할당 받은 객체와 배열 메모리를 자바 가상 기계로 되돌려주는 행위
  • 자바에서는 사용자 임의로 객체 소멸이 안됨

 

가비지
  • 가리키는 레퍼런스가 하나도 없는 객체 = 더이상 접근할 수 없어 사용할 수 없게 된 메모리

 

패키지와 접근 지정자
패키지란?
  • 상호 관련 있는 클래스 파일(컴파일된 .class)을 저장하여 관리하는 디렉터리
  • 자바 응용프로그램은 하나 이상의 패키지로 구성

 

접근 지정자란?
  • 클래스나 일부 멤버를 공개하여 다른 클래스에서 접근을 허용하기 위함
  • 객체 지향 언어의 캡슐화 정책은 멤버를 보호하는 목적이 있으며 이를 일부 해제하기 위해 접근 지정자를 사용
private : 동일 클래스 내에만 접근을 허용하며 상속 받은 서브 클래스에서 접근 불가
protected : 같은 패키지 내의 다른 모든 클래스에게 접근 허용하며 상속 받은 서브 클래스는
다른 패키지에 있어도 접근 가능
public : 패키지에 관계 없이 모든 클래스에게 접근을 허용
default : 같은 패키지 내의 다른 클래스에게 접근 허용

 

static 멤버와 non-static 멤버 특성 차이
  non-static 멤버 static 멤버
공간적 특성 멤버는 객체마다 별도 존재하며
인스턴스 멤버라고 부름
멤버는 클래스 하나당 생성
멤버는 객체 내부가 아닌 별도의 공간에 생성
클래스 멤버라고 부름
시간적 특성 객체 생성시 멤버 생성
객체 생성 후 멤버 사용 가능
객체가 사라지면 멤버도 사라짐
클래스 로딩 시에 멤버 생성
객체가 생기기전 이미 멤버 존재하며 사용 가능하며 객체가 사라져도 멤버는 사라지지 않음
멤버는 프로그램이 종료될 때 사라짐
공유의 특성 공유 X 
멤버는 각 객체마다 공간 유지
공유 O
동일 클래스의 모든 객체들에 의해 공유됨
  • static의 활용
    • 전역 변수와 전역 함수를 만들 때 활용
    • 공유 멤버를 만들고자 할 때
    • 단 static 메소드는 static 멤버만 접근 가능
    • static 메소드는 this 사용 불가 
      • 객체 없이도 static 메소드가 사용 가능하기 때문.
  • 경우에 따라 각 인스턴스들이 공통적으로 같은 값을 가져야 하는 경우 static을 사용
  •  static이 붙은 멤버 변수는 인스턴스 생성하지 않고도 사용할 수 있다 
    • 왜냐하면 static이 붙은 멤버변수는 클래스가 메모리에 올라갈때 이미 자동적으로 생성되기 때문
    • static을 이용한 메소드는 호출시간이 짧다 = non-static 메소드는 실행시 호출 되어야할 메소드를 찾는 과정이 추가적으로 필요하기 때문에 시간이 더 필요하다
  •  static을 이용한 메소드는 오로지 static 멤버로만 접근이 가능하다. 
  •  인스턴스 변수를 사용하지 않는 메소드에 대해서만 static으로 선언하자 !

 

final 클래스와 메소드
  • final 클래스는 더 이상 클래스 상속 불가능
  • 오버라이딩 또한 불가능
  • 상수를 선언할 때 사용
  • 상수 필드는 선언 시 초기 값을 지정해주어야함
  • 상수 필드는 실행 중 값 변경 X

 

 

핵심 요약
클래스 본체에서는 다음과 같은 내용을 선언할 수 있다.
- 멤버(필드, 메서드, 중첩 클래스, 중첩 인터페이스)
- 클래스 초기화, 인스턴스 초기화
- 생성자

* 메소드, 생성자는 다중으로 정의할 수 있다.

Method Override 
- 상속 관계에 있는 클래스간 같은 이름의 메소드를 재정의 하는 것
- 한 클래스 내의 여러개의 메소드를 정의하므로 가독성이 올라감

Method Overload
- 같은 메소드라도 매개변수만 다르면 얼마든지 사용/정의가 가능하게 하는 것
- 단 파라미터의 갯수가 달라야 한다. 파라미터의 갯수가 같을 경우 데이터 타입이 달라야 한다.
- 반환형은 같아도 되고 달라도 된다
- 상속 받은 메소드의 로직을 조건에 맞게 변경하는 객체지향언어의 특징 중 다형성에 해당된다.

'Java' 카테고리의 다른 글

Java - 패키지와 모듈화 / Wrapper  (0) 2022.06.21
Java - 상속/인터페이스/추상클래스  (0) 2022.06.21
Java - 컬렉션  (0) 2022.06.19
Java - 객체(2)  (1) 2022.04.25
Java - 객체(1)  (0) 2022.04.21