20230213 [Java] 클래스와 객체, 메소드 등 헷갈리는 개념 총정리!

Daisy🌷·2023년 2월 13일
0

클래스 Class

  • 클래스는 고유성을 가진 객체가 모여 개념화된 특성을 정의한 것이다.
  • 클래스를 비유한 가장 유명한 예시가 바로 '붕어빵 틀'일 것이다.
  • 이 붕어빵 틀에서 생성된 객체가 바로 붕어빵이다.
    다시말해 클래스의 정의대로 객체가 연산자를 통해 메모리 영역에 생성되는 것이다.
  • 객체는 클래스가 없으면 생성되지 못한다.

객체 Object = 인스턴스 Instance

  • 객체란 속성과 기능이 묶인 프로그램 단위를 말한다.
  • 여기서 속성(attribute)는 객체가 가진 고유한 특성이고 기능(function)은 객체의 행동 패턴을 말한다.

메소드 Method

  • 메소드는 객체 간에 교류되는 프로그램화한 명령 메시지 단위이다. 쉽게 말해 데이터(객체)의 동작 처리 내용을 말한다.
  • 가끔 프로그래밍을 하다 보면 똑같은 내용을 자신이 반복해서 적고 있는 것을 발견할 때가 있다. 이 때가 바로 메서드가 필요한 때이다. 여러 번 반복해서 사용된다는 것은 언제고 또다시 사용할 만한 가치가 있는 부분이라는 뜻이다. 즉, 이러한 경우 이것을 한 뭉치로 묶어서 "어떤 입력값을 주었을 때 어떤 리턴값을 돌려준다"라는 식의 메서드를 작성하는 것이 현명한 일일 것이다.

메소드의 선언

[접근제어자] [반환형] [메서드명](입력자료형1 매개변수1, 입력자료형2 매개변수2, ...) {
    ...    
    return 리턴값;  // 리턴자료형이 void 인 경우에는 return 문이 필요없다.
}
  • 매개변수 : 메서드에 입력으로 전달된 값을 받는 변수를 의미한다.
    -> 메서드에 전달된 값을 저장하는 변수
  • 접근제어자(public, private, protected)
    public : 모든 곳에서 접근 가능하다.
    private : 자기 자신 클래스에서만 접근 가능하다.
    protected : 자기 자신 클래스와 상속된 클래스에서 접근 가능하다.

스태틱(Static) - 1

class HouseLee {
    String lastname = "이";
}
public class Sample {
    public static void main(String[] args) {
        HouseLee lee1 = new HouseLee();
        HouseLee lee2 = new HouseLee();
    }
}
  • 이씨 집안을 나타내는 HouseLee 클래스이다. 위와 같은 클래스를 만들고 객체를 생성하면 객체마다 객체변수 lastname을 저장하기 위한 메모리가 별도로 할당된다. 하지만 가만히 생각해 보면 HouseLee 클래스의 lastname은 어떤 객체이던지 동일한 값인 "이"이어야 할 것 같지 않은가? 이렇게 항상 값이 변하지 않는 경우라면 static 사용 시 메모리의 이점을 얻을 수 있다.
class HouseLee {
    static String lastname = "이";
}
public class Sample {
    public static void main(String[] args) {
        HouseLee lee1 = new HouseLee();
        HouseLee lee2 = new HouseLee();
    }
}
  • 위와 같이 lastname 변수에 static 키워드를 붙이면 자바는 메모리 할당을 딱 한번만 하게 되어 메모리 사용에 이점이 있다.
  • 만약 HouseLee 클래스의 lastname 값이 변경되지 않기를 바란다면 static 키워드 앞에 final이라는 키워드를 붙이면 된다. final 키워드는 한번 설정되면 그 값을 변경할 수 없다. 변경하려고 하면 오류가 발생한다.

스태틱(Static) - 2

  • static을 사용하는 또 한가지 이유로 공유 개념을 들 수 있다. static으로 설정하면 같은 곳의 메모리 주소만을 바라보기 때문에 static 변수의 값을 공유하게 되는 것이다.
  • 웹사이트 방문시마다 조회수를 증가시키는 Counter 클래스가 다음과 같다고 가정해보자.
class Counter  {
    int count = 0;
    Counter() {
        this.count+=1;
        System.out.println(this.count);
    }
}
public class Sample {
    public static void main(String[] args) {
        Counter c1 = new Counter();
        Counter c2 = new Counter();
    }
}
  • c1, c2 객체 생성시 생성자에서 객체변수인 count의 값을 1씩 증가하더라도 c1과 c2의 count는 서로 다른 메모리를 가리키고 있기 때문에 원하던 결과(카운트가 증가된 결과)가 나오지 않는다. 객체변수는 항상 독립적인 값을 갖기 때문에 당연한 결과이다.
class Counter  {
    static int count = 0;
    Counter() {
        count+=1;  
        System.out.println(count); 
    }
}
public class Sample {
    public static void main(String[] args) {
        Counter c1 = new Counter();
        Counter c2 = new Counter();
    }
}
  • int count = 0 앞에 static 키워드를 붙였더니 count 값이 공유되어 다음과 같이 count가 증가되어 출력된다.
  • 보통 변수의 static 키워드는 프로그래밍시 메모리의 효율보다는 공유의 목적으로 훨씬 더 많이 사용한다.

static 메서드

  • static이라는 키워드가 메서드 앞에 붙으면 이 메서드는 스태틱 메서드(static method)가 된다.
class Counter  {
    static int count = 0;
    Counter() {
        count++;
        System.out.println(count);
    }
    public static int getCount() {
        return count;
    }
}
public class Sample {
    public static void main(String[] args) {
        Counter c1 = new Counter();
        Counter c2 = new Counter();
        System.out.println(Counter.getCount());  // 스태틱 메서드는 클래스를 이용하여 호출
    }
}
  • Counter 클래스에 getCount() 라는 static 메서드가 추가되었다. 메서드 앞에 static 키워드를 붙이면 Counter.getCount() 와 같이 객체 생성없이 클래스를 통해 메서드를 직접 호출할 수 있다.
  • 스태틱 메서드 안에서는 객체변수 접근이 불가능 하다. 위 예에서는 count 변수가 static 변수이기 때문에 스태틱 메서드(static method)에서 접근이 가능하다.
profile
티스토리로 블로그를 이전했습니다. 😂 구경 오세요! 👉🏻 https://u-ryu-logs.tistory.com

0개의 댓글