자바 기초 - 클래스와 객체

지우·2023년 1월 5일
0

CNU SW 아카데미 2기

목록 보기
2/10

JAVA는 대표적인 객체 지향 프로그래밍 언어이다. 이때, 객체란 무엇일까?

객체 지향은 과정을 중시하는 절차 중심의 설계가 아니고, 실체를 중시하는 설계이다. 따라서 객체 지향은 시스템의 모듈화, 캡슐화를 촉진하여 복잡화, 거대화되는 소프트웨어를 사용하기 쉽고, 작성하기 쉬우며, 유지 보수하기 쉬운 방향으로 재구축하는 새로운 기법으로 각광받고 있다. (출처 : 지식백과)

객체라는 단어를 자주 접하고 객체 지향 언어를 사용해 왔지만, 정확히 어떤 개념인지는 잘 알지 못했던 것 같다. 클래스와 객체가 어떤 기능을 하고 무엇으로 이루어져 있는지 등에 대해 정리해본다.



✔️클래스와 객체

💡정의

  • 객체 : 실존하는 대상
  • 클래스 : 객체를 정의하기 위해 특징 및 기능을 분류하여 정의하는 역할

따라 정의된 클래스를 구체화하여 표현한 것을 객체라고 한다. 쉽게 설명하자면, 어떠한 특징과 기능을 클래스에 모아두고, 이를 하나하나의 객체로 표현하는 것이다.

클래스 : 인간의 개념적인 특징
객체 : 김ㅇㅇ, 박ㅇㅇ처럼 개개인을 나타냄

💡기본 타입 vs 참조 타입

  • 기본 타입
    정수, 실수, 문자, 논리 값을 변수로 저장할 때
    메모리에 변수가 할당되고, 값이 직접 저장됨

  • 참조 타입
    객체 및 클래스, 인터페이스, 배열 등을 변수에 저장할 때
    메모리에 변수가 할당되고, 이 변수에 객체 값이 아닌 객체의 메모리 주소가 저장됨 (=메모리 주소를 참조)

💡인스턴스

클래스 → 객체 → 실체화한 것. 힙 메모리 영역에 객체가 생성된 것을 뜻하며, new 연산자를 사용하여 생성한다.

이때 new 연산자는, 인스턴스를 생성한 뒤 해당 메모리 주소를 반환한다. 자바로 코딩하다보면 객체를 생성할 때마다 new를 사용하곤 했는데, 정확한 의미를 잘 모르고 사용했었다.

Car car = new Car();

Car은 이전에 생성된 클래스명이고, car은 인스턴스를 저장할 변수에 해당한다. car은 참조 변수로, 인스턴스의 메모리 주소를 참조하게 된다.

new 연산자로 같은 클래스의 인스턴스를 여러 개 생성해도 전부 다른 메모리 주소를 갖게 된다. 즉 전부 다른 의미를 갖는다.

객체 =/= 인스턴스

인스턴스는 메모리에 실체화된 특정 객체를 의미하기 때문에 객체의 하위 개념으로 볼 수 있다.

💡정리

즉, 어떠한 특징과 기능을 모아둔 것은 클래스,
이를 구체화한 것은 객체,
new 연산자로 메모리에 실체화한 특정 개체는 인스턴스인 것이다.


✔️클래스 구성 요소

💡필드

필드는 객체가 가지는 속성을 나타낸다. 클래스 Car의 경우, 크기, 가격, 성능 등을 예로 들 수 있다. 주로 클래스 선언 후 가장 먼저 정의한다.

선언

String name = "abc";
int price = 500;

변수를 선언하는 것과 형식은 같다.

호출

인스턴스.필드명으로 호출한다.

System.out.println(car.price);

클래스 내부에서 호출할 때는 필드명을 그냥 사용하면 된다.

💡메소드

함수와 같은 개념이다. 함수에 어떠한 기능을 수행하는 코드를 입력하고 중괄호 { }로 감싸 정의하면, 이후 해당 동작을 수행하고 싶을 때 함수를 호출하는 것으로 간편화할 수 있다.

따라 메소드는 객체의 동작을 정의하는 역할을 한다. 함수 여러 개를 정의하면 해당 객체는 호출된 함수의 동작을 수행하는 것이다.

선언

int maxNum(int a, int b) {
	int max = 0;
	if (a > b) {
    	max = a;
    } else{
   		max = b;
    }
    return max;
}

메소드는 위처럼 선언할 수 있다. return할 값의 타입을 먼저 붙이고 메소드명, 매개변수와 함께 선언한다. 매개변수가 없다면 maxNum()처럼 비워둔다. return값이 없다면 타입 대신 void를 작성한다.

void printmassage() {
	System.out.println("hi~");
}

처럼 선언하면 된다.

호출

이후 특정 메소드를 호출할 때, (클래스 외부의 경우) 변수명.메소드명(매개변수) 형식으로 호출할 수 있다.

public class Car {
	int maxNum(int a, int b) {
    	//생략
    }
}

a = 1; b = 2;
Car car = new Car();
car.maxNum(a, b); //메소드 호출

클래스 내부에서 호출할 때는 메소드명(매개변수)만으로도 호출 가능하다.

printmassage();

💡생성자

객체를 생성할 때 초기화하는 역할을 한다.

Car car = new Car();

에서, Car()에 해당하는 부분이라 볼 수 있다. 생성과 동시에 생성자를 호출하여 초기값을 설정한다.

생성자는 별도로 선언해도 되고 그러지 않아도 된다. 선언된 생성자가 없을 경우 디폴트 생성자가 자동 호출된다.

선언
생성자명은 클래스 이름과 같아야 한다. 또한 초기화하는 역할만 하므로 return이 없다. 매개변수는 초기화하는 값에 따라 달라진다.

public class Car {
	String name;
    int price;
    //생성자
    public Car(String n, int p) {
    	name = n;
        price = p;
    }
}

생성자를 이렇게 생성했으면, 형식에 맞게 호출해야 한다.

Car car = new Car("abc", 500);

디폴트 생성자의 경우 별도의 필드 등 초기화 없이 객체가 생성된다. new Car() 형식으로 별다른 매개변수 없이 호출하면 된다.

💡예시 - String 문자열 클래스

자바를 처음 사용하지 않는 이상 String 타입은 익숙할 것이다. String은 클래스에 해당하기 때문에 메소드 역시 활용할 수 있다.

  1. 비교
    다른 변수의 경우 == 연산자로 비교했었다. 하지만 String 문자열의 경우 같은 문자열임에도 다른 메모리 주소를 가질 경우 다르다고 판단하게 된다. equals() 메소드는 이러한 문제를 해결한다. 문자열 ab를 비교하고 싶을 때, a.equals(b) 혹은 b.equals(a)로 메소드를 호출한다. 같으면 true를, 다르면 false를 반환한다.
    두 문자열에 값이 있다면 순서에는 상관 없지만, 괄호 안에는 주로 null 값이 올 수 있는 변수를 넣는 것이 좋다. (오류 x)
  2. 연결
    a.concat(b)로 문자열 ab를 연결할 수 있다. 하지만 a + b로도 충분히 연결할 수 있고 성능 역시 좋기에, +로 합치는 것을 권장한다.
  3. 슬라이싱
    a.substring(start, end)로 문자열을 원하는 만큼 자를 수 있다. 매개변수로는 원하는 인덱스 값을 넣어주며, start 부터 end 전까지 (포함 x) 잘라 반환한다.

사실 학부 3학년 과정을 끝낸 나에게는 알고 있는 개념이 많을 수밖에 없었다. 하지만 막 코딩을 접할 때 대충 집어넣었던 지식이라 감으로 사용하는 것이었지, 정확한 원리..? 랄 것은 몰랐던 것 같다. 이렇게 강의를 듣고, 실습을 하고, 따로 정리까지 하며 완벽히 이해할 수 있었다.

profile
기록용

0개의 댓글