11일차 09/02 2022

SangYu Lee·2022년 9월 2일
0

codestates backend

목록 보기
12/30

keyword - 클래스, 객체, 필드, 메서드

1. 클래스와 객체

클래스라는 것은 보통 '틀' 혹은 '설계도'에 비유된다. 어떤 물체의 구조와 기능을 나타낸 것인데, 그 클래스로부터 실제로 생성된 것이 객체이다.

간단하게 '사람'으로 비유하면 사람은 대부분 공유하는 속성과 기능이 있다. 사람은 머리카락이 있고, 눈을 가지고 있으며 다리는 두개이고 팔도 두개이다. 이러한 기본적인 구조에서 실제로 생성된 것이 사람이다. 사람 클래스에서 인스턴스화된 '나'라는 객체는 다른 사람처럼 머리카락도 있고 팔다리도 2개씩 있고 눈도 달려있다.

그렇지만 다 같은 머리카락이고 눈인가? '나'라는 객체는 머리카락은 검은색이고, 곱슬머리이다. 눈은 갈색이고 팔다리는 키에 비해 길지 않다. 다른 나라에 사는 어떤 사람 클래스의 객체는 머리는 노랗고 눈은 파란색일 수도 있다.

또한, '나'는 html 문법을 사용해서 웹페이지를 만드는 일(기능)을 할 수 있다. 그런데 공무원 시험 준비를 하는 '내친구'는 인스타에서 맛집 찾기라는 일(기능)을 할 수 있다.

이렇게 객체는 같은 클래스에서 생성되었을지라도 속성과 기능이 각자 다른데, 사람의 팔 다리 눈과 같은 속성을 자바 클래스에서는 '멤버 변수' 라고 하고 기능을 메서드(method)라고 부른다

2. 객체의 생성

클래스의 객체를 생성하는 방법은 new연산자를 이용하는 방법이 있다.

Person me = new Person("서울",27);

new 연산자는 Person("서울",27)이라는 정보를 바탕으로 Person 클래스의 인스턴스를 힙 메모리에 생성하고 그 주소를 'me'라는 참조변수에 할당한다. 참조변수 생성과 인스턴스 생성 후 할당이 같이 이루어진 것이다.

3. 멤버변수와 메서드 생성

class Person {
	public int eyeNum = 2;
    public String hairColor;
    private String temper;
    
    public static getAngry(){
    	System.out.println("나 화났음 진짜로");
    }
}

4. 자바 메모리 활용구조

메모리 구조를 알면 꽤 많은 것들이 설명된다.
출처 : https://hoonmaro.tistory.com/19

위 사진은 자바 실행과정인데 지금 볼 것은 Runtime Data Areas다.

Person me = new Person("서울",27);

위에 있던 코드에서 new연산자는 메모리의 heap 영역에 객체를 생성하고, 그 객체를 참조하는 변수인 'me'는 stack 영역에 저장된다. 몇가지 알게된 사실은

  • 메서드의 경우에는 인스턴스 메서드, 클래스 메서드 모두 메모리의 method area 에 저장된다. 그래서 모든 객체에서 메서드(기능)를 공유할 수 있는 것이다.
  • heap에 생성된 객체에 메서드가 포함되어 있다면, heap 메모리에 생성된 객체에서 메서드 부분은 method area에 있는 메서드를 '가리키고' 있다.
  • 클래스 내부에 있는 메서드끼리는 따로 객체를 생성하지 않고도 서로를 호출할 수 있다.
  • 필드의 경우 다른 지역변수들과 다르게 초기화를 하지 않아도 기본값이 자동으로 초기화 된다는 특징을 가지고 있다. String의 경우 null, int의 경우 0으로 초기화 된다.
    => 왜냐하면 heap에 들어가기 위해서는 정해진 용량이 있어야 하기 때문에 알아서 초기화 시키는 것이다.

static

static이 들어간 클래스, 멤버 변수, 메서드는 모두 객체의 생성과 상관없이 사용할 수 있다.

Person.getAngry(); //객체 생성 필요없음

그러나 생성하고 사용해도 오류는 나지 않는다. 단지 헷갈릴 뿐이지. 근데 의문이 하나 생긴다.

인스턴스 메서드는 static 메서드와 같이 메모리의 method area에 저장되는데, 인스턴스 메서드는 객체 생성을 해야만 사용할 수 있고, static 메서드는 객체 생성이 없이도 사용이 가능한가?

=> 나의 생각은, 같은 곳에 저장되는 것은 맞지만, 인스턴스 메서드가 메모리의 method area에 저장되기 위해서는 객체 생성을 해야되는 것이 아닐까? static method는 클래스로더가 바이트코드를 method area로 옮길 때 바로 로드되지만 인스턴스 메서드는 객체가 생성이 되고 나서야 method area에 추가되는 방식인 것이다.

메서드 오버로딩

class Payment {
	private static int balance = 5000;
   
   public void pay(int price) { };
   
   public void pay(String product, int price) { };
   
   public String pay(String product, int price, int installments) { };
}

매서드 오버로딩이란 하나의 클래스 안에 같은 이름의 메서드를 여러 개 정의하는 것이다.

  1. 메서드 이름이 같아야 하고
  2. 매개 변수가 달라야 한다.
  3. 반환 타입이 다르다고 해서 오버로딩이 되지는 않는다.

위의 예시를 보면 돈을 지불하는 pay라는 메서드에 오버로딩이 2번이 되어있는 것을 볼 수 있다. 그냥 지불할 때도 있고, 물건 정보를 받아서 지불할 수도 있고, 물건 정보와 할부 정보를 받아서 지불할 때도 있는 것이다.

profile
아이스커피

0개의 댓글