[Java] 클래스

jinni·2022년 11월 22일
0

Java

목록 보기
4/5
post-thumbnail

객체 지향

객체 지향은 ‘실제 세계는 사물(객체)로 이루어져 있으며, 발생하는 모든 사건들은 사물 간의 상호작용’이다. 라는 것이다.

객체 지향 언어의 특징

  • 코드의 재사용성 높음
  • 코드의 관리 용이
  • 신뢰성이 높은 프로그래밍 가능

무턱대고 객체지향적으로 코드로 작성하는 것은 쉽지 않은 일이기에, 우리는 객체지향적인 프로그래밍에 너무 얽매이지 말고, 일단 프로그래밍 이후에 객체지향적으로 코드를 개선할 수 있을 지를 고민하는 것도 좋은 방법이다.


클래스와 객체

클래스와 객체의 정의 및 용도

클래스

  • 정의: 객체를 정의 해둔 것. → 클래스는 객체 그 자체가 아니다.
  • 용도: 객체를 생성하는 데 사용.

객체

  • 정의: 실제로 존재하는 것. 사물 or 개념
  • 용도: 객체가 가지고 있는 기능과 속성에 따라 다름.

💡 왜 클래스를 통해 객체를 생성할까?
클래스만 잘 만들어 놓는다면, 객체를 바로 생성해서 사용할 수 있기 때문!!

객체의 구성요소 - 속성과 기능

  • 속성: 멤버변수, 특성, 필드, 상태 → 멤버변수 주로 사용.

  • 기능: 메서드, 함수, 행위 → 메서드 주로 사용

인스턴스의 생성과 사용

// case1 -> 보통 잘 사용하지 않음.
// 여기서 변수는 참조변수를 뜻한다.
클래스명 변수명;
변수명 = new 클래스명(); 

// case2 -> 요걸 주로 사용.
// new 연산자를 통한 클래스의 인스턴스 주소를 참조변수에 넣어주는 것!!!
클래스명 변수명 = new 클래스명();
💡 인스턴스는 참조변수를 통해서만 다룰 수 있고, 참조변수의 타입은 인스턴스의 타입과 일치해야 한다 !!
class Person {
		String name;

		public static void main(String[] args) {
				Person student1 = new Person();
				Person student2 = new Person();
				student1 = student2;
		}
}

위와 같이 서로 다른 객체를 생성했을 때, 한 객체가 다른 객체를 참조하게 된다면 본래 갖고 있던 객체는 메모리에서 삭제된다. (by GC)


변수와 메서드

변수의 종류

  • 지역변수는 항상 변수의 범위(스코프)를 조심해야 한다.

메서드

메서드를 사용해야 하는 이유?

  1. 높은 재사용성
  2. 중복된 코드 제거
  3. 프로그램의 구조화

⇒ 작업 단위로 나눠서 여러 개의 메서드에 담아 프로그램의 구조를 단순화 시키는 것은 필수불가결임.

JVM 메모리구조

메서드 영역 (Method Area)

  • 클래스 실행 → JVM은 해당 클래스의 클래스 파일(*.class) read
  • 클래스에 대한 정보(클래스 데이터)를 저장한다. → 이때 클래스 변수도 같이 생성

힙 (Heap)

  • 인스턴스가 생성되는 공간 (인스턴스 변수,,, 등)

호출스택 (Call stack)

  • 메서드의 작업에 필요한 메모리 공간을 제공한다.
  • 메서드가 작업을 마치면, 할당되었던 메모리 공간은 반환.

그래서 여러 개의 메서드를 실행하는 로직을 작성했을 때, 각각의 메서드마다 메모리를 부여하게 된다. 첫 번째로 호출된 메서드가 스택 맨 밑에, 두 번째로 호출된 메서드가 바로 그 위에, 이런 식으로 쌓이게 된다.

First In Last Out 이라고 생각하면 편할 것이다.

스택의 가장 위에 있는 메서드가 현재 실행 중인 메서드이며, 실행이 끝난 메서드는 스택에서 바로 사라지게 된다. 즉, 메모리가 제거됨. 그래서 First In Last Out 이라고 표현한 것이다.

기본형 매개변수와 참조형 매개변수

기본형 매개변수 변수의 값을 읽기만 할 수 있다. (read only)

참조형 매개변수 변수의 값을 읽고 변경할 수 있다. (read & write)

기본형 매개변수

public class paramTest {
    static class Data {
        int x;
    }

    static void change(int x) {
        x = 1000;
        System.out.println("change(): " + x);
    }

    public static void main(String[] args) {
        Data d = new Data();
        d.x = 10;
        System.out.println("main(): " + d.x);


        change(d.x);
        System.out.println("=== change 후 x 값===");
        System.out.println("x값: " + d.x);
    }
}

참조형 매개변수

public class paramTest {
    static class Data {
        int x;
    }

    static void change(Data d) {
        d.x = 1000;
        System.out.println("change(): " + d.x);
    }

    public static void main(String[] args) {
        Data d = new Data();
        d.x = 10;
        System.out.println("main(): " + d.x);

		change(d);
        System.out.println("=== change 후 x 값===");
        System.out.println("x값: " + d.x);
    }
}

각각의 결과로 알 수 있듯이, 기본형 매개변수가 파라미터로 들어가게 되면, 원본 데이터를 건드릴 수 없다. 하지만, 참조형 매개변수를 파라미터로 넣어주면, 주소값을 고대로 넣어주는 것이기 때문에 원본 데이터를 건드릴 수 있다.

이 글은 자바의 정석을 공부하면서 정리한 글입니다!

profile
조금씩 천천히 꾸준하게

0개의 댓글