객체

객체지향 언어에서 말하는 객체(Object)는 현실 세계에서 존재하는 유/무형의 모든 것을 의미한다.

현실 세계의 객체는 명사적인 특징과 동사적인 특징으로 구성되는데, 예를 들어 학생이라는 객체를 대상으로 명사적 특징과 동사적 특징을 정리해보면 다음과 같은 결과가 나온다.

 

객체 이름: 학생

명사적 특징: 학교 이름, 전공, 학년, 성별, 이름, 시험 점수, 나이, 주소

동사적 특징: 점심을 먹는다. 수업을 듣는다. 시험을 본다. 게임을 한다.

 

이런 객체의 명사적 특징과 동사적 특징을 기반으로 소스 코드 형태의 클래스를 만드는 것이다.

 

클래스

클래스(class)는 지금까지 우리가 작성했던 모든 자바 파일에 포함되어 있었다. 

우리가 작성하는 모든 자바 프로그램은 클래스 형태였다. 하지만 지금까지 테스트를 위해 작성햇던 클래스는 실제 프로그램에서 사용되는 클래스와는 많이 다르다.

 

실제 프로그램에서 사용하는 클래스는 객체와 관련되어 있다. 현실 세계에 존재하는 학생 객체를 컴퓨터 프로그램에서 이용하기 위해서는 학생 객체가 반드시 컴퓨터 메모리에 존재해야 한다. 하지만 현실 세계에 존재하는 학생을 컴퓨터 메모리에 집어넣는 것이 불가능하기 때문에 학생 객체를 추상화하여 소스 코드 형태의 클래스를 만드는 것이다.

 

객체 기반으로 클래스를 만들 때는 객체의 명사적 특징은 멤버 변수로, 동사적 특징은 메소드로 변환한다. 

//  클래스 선언
class Student {
    // 멤버 변수 선언
    String schoolName;
    String major;
    int grade;
    String idNumber;
    char gender;
    String name;
    int score;
    int age;
    String address;
    
    // 메소드 선언
    void haveLunch () {
        System.out.println("점심을 먹는다.");
    }
    
    void takeClass() {
        System.out.println("수업을 듣는다.");
    }
    
    void takeTest() {
        System.out.println("시험을 본다.");
    }
    
    void playGame() {
        System.out.println("게임을 한다.");
    }

중요한 것은 클래스를 만들 때 어떤 관점에서 객체를 바라보느냐에 따라 클래스의 모습이 달라진다는 것이다. 예를 들어 학사 관리 시스템을 개발한다면 학생 객체에서 중요한 명사적 특징은 전공, 이름, 시험 점수일 것이다.

 

하지만 놀이공원 예약 시스템을 개발하는 경우라면 전공이나 시험 점수 같은 정보는 전혀 중요하지 않으며 오히려, 전화번호나 이메일 정도가 중요하게 사용될 것이다. 이렇게 어떤 과점에서 객체를 바라보느냐에 따라 다양한 모습의 클래스가 만들어진다.

 

인스턴스

인스턴스(instance)는 클래스를 이용하여 메모리에 생성한 객체를 의미한다. 그런데 현실세계에 존재하는 객체도 객체라고 부르고, 클래스를 통해 메모리에 생성한 객체도 객체라고 부르기 때문에 혼란이 생길 수 있다.

 

이런 혼란을 피하기 위해 메모리상의 객체를 인스턴스라고 부른느데, 개발자들은 메모리상의 인스턴스를 편의상 객체라고 부르기 때문에 현실 세계의 객체와 혼동되는 것이다. 일반적으로 객체라고 하면 메모리상의 인스턴스를 의미한다고 보면 된다.

 

728x90

'Language > JAVA' 카테고리의 다른 글

[JAVA] 클래스 Class (3)  (0) 2023.10.18
[JAVA] 클래스 Class (2)  (0) 2023.10.18
[JAVA] 버블 정렬 알고리즘  (0) 2023.10.18
[JAVA] 참조 변수와 null  (0) 2023.10.18
[JAVA] 배열  (0) 2023.10.18

버블 정렬 알고리즘

public class Main {
    public static void main(String[] args) {
        int[] rotto = {7, 44, 16, 32, 1, 22};

        int temp = 0;
        for( int i = 0; i < rotto.length-1 ; i++) {
            for( int j = 0; j <rotto.length-(i+1) ; j++) {
                if(rotto[j] > rotto[j+1]) {
                    temp = rotto[j];
                    rotto[j] = rotto[j+1];
                    rotto[j+1] = temp;
                }
            }
        }

        for(int rot: rotto) {
            System.out.print(rot);
            System.out.print(' ');
        }
        // 1 7 16 22 32 44 
    }
}

 

API를 이용한 정렬

자바가 제공하는 유틸리티 클래스를 이용하여 좀 더 쉽게 정렬을 처리할 수 있다. java.util 이라는 패키지에 Arrays라는 클래스를 이용하면 다음과 같이 정렬 작업이 매우 간단하게 처리된다.

public class Main {
    public static void main(String[] args) {
        int[] rotto = {7, 44, 16, 32, 1, 22};
        java.util.Arrays.sort(rotto);

        for(int rot: rotto) {
            System.out.print(rot);
            System.out.print(' ');
        }
        // 1 7 16 22 32 44
    }
}

 

728x90

'Language > JAVA' 카테고리의 다른 글

[JAVA] 클래스 Class (2)  (0) 2023.10.18
[JAVA] 클래스 Class (1)  (0) 2023.10.18
[JAVA] 참조 변수와 null  (0) 2023.10.18
[JAVA] 배열  (0) 2023.10.18
[JAVA] 이름이 있는 break  (0) 2023.10.18

참조 변수에는 특정 객체의 주소 정보가 저장된다. 참조변수가 아무런 주소를 가지지 않는 상태를 null이라고 표현한다.

public class Main {
    public static void main(String[] args) {
        int[] scoreList = {83, 76, 99, 100, 68};
        System.out.println(scoreList); // [I@6b884d57
        scoreList = null;
        System.out.println(scoreList); // null
    }
}

위 소스에서 scoreList 변수는 처음에는 배열 객체의 주소를 가지고 배열 객체를 참조하다가 nullㅇ니 할당되면서 주소 정보가 사라지는 null 상태가 되었다. 

참조 변수에 null이 할당된 이후에 메모리에 있는 배열 객체는 JVM에 의해 자동으로 메모리에서 제거되는데, 이것을 가비지 컬렉션(garbege collection)이라고 한다. 가비지 컬렉션은 참조되지 않는 객체들을 메모리에서 제거함으로써 메모리의 여유 공간을 늘리는 작업을 말한다.

728x90

'Language > JAVA' 카테고리의 다른 글

[JAVA] 클래스 Class (1)  (0) 2023.10.18
[JAVA] 버블 정렬 알고리즘  (0) 2023.10.18
[JAVA] 배열  (0) 2023.10.18
[JAVA] 이름이 있는 break  (0) 2023.10.18
[JAVA] 데이터 타입 변환  (0) 2023.10.18

자바 배열 기초

배열(array)는 자바 프로그램에서 자주 사용하는 매우 중요한 개념이다. 배열의 사전적 의미는 '동일한 타입의 데이터가 일정한 순서로 모여 있는 것'을 의미하는데, 자바는 이런 배열을 참조 타입이라는 독특한 형태로 사용한다.

 

배열 객체 생성

new 데이터타입[배열크기];

배열 객체를 생성할 때 가장 먼저 등장하는 것이 new라는 예약어이다. JVM은 new라는 예약어를 만나는 순간 가장 먼저 객체 생서에 필요한 메모리 공간을 확보한다. 이때 중요한 정보가 바로 배열의 데이터타입과 크기이다. 만약 new int[5]; 라고 했다면 int타입(4byte)의 데이터 5개를 저장한다는 의미이므로 정수 5개를 저장할 수 있는 20byte만큼의 메모리 공간이 확보되는 것이다.

 

배열 객체는 생성되는 순간 각 저장 공간에 0부터 시작하는 인덱스 번호가 자동으로 부여되며, 각 인덱스에는 기본값이 자동으로 할당된다. 이를 배열의 기본 초기화라고 한다.

 

배열과 참조 변수

객체지향 언어를 이용하여 프로그램을 개발하면 수많은 객체들이 메모리에 생성되며, 각 객체는 고유한 메모리 주소를 갖는다. 그런데 프로그램에서 객체를 사용하기 위해 객체들의 메모리 위치를 외어서 사용하는 것은 불가능하다.

따라서 메모리 주소를 사람이 기억할 수 있는 참조 변수라는 것에 할당하고, 이 참조 변수를 통해 메모리상의 객체를 사용하는 것이다.

데이터타입[] 참조변수;

예) int[] scoreList;
double[] avgList;
String[] addressList;

 

배열 참조 변수 선언과 관련된 각 요소의 의미는 다음과 같다.

 

데이터 타입: 배열에 저장되는 데이터의 종류를 결정한다.

[] : 배열 첨자라고 읽으며, 현재 변수가 배열 변수임을 의미한다. 이 첨자의 개수에 따라 배열의 차원이 결정된다.

참조변수: 배열 객체의 주소가 할당될 참조 변수의 이름이다.

 

데이터타입[] 참조변수 = new 데이터타입[데이터크기];

int[] scoreList = new int[5];
public class Main {
    public static void main(String[] args) {
        int score = 83;
        int[] scoreList = new int[5];

        System.out.println("기본형 score : " + score);
        System.out.println("참조형 scoreList : " + scoreList);
    }
}

배열의 사용

배열의 참조 변수를 이용하면 배열 객체가 생성된 메모리의 특정 위치까지 접근할 수 있다.

이는 마치 주소를 통해 특정 건물을 찾아가는 과정과 동일하다. 즉, scoreList라는 참조 변수를 이용하면 메모리에 다른 객체가 있다 하더라도 정확하게 scoreList변수가 참조하는 배열객체를 찾아갈 수 있는 것이다.

 

public class Main {
    public static void main(String[] args) {
        int[] scoreList = new int[5];
        scoreList[0] = 76;
        scoreList[1] = 92;
        scoreList[2] = 49;

        System.out.println("scoreList[0] : " + scoreList[0]);
        System.out.println("scoreList[0] : " + scoreList[1]);
        System.out.println("scoreList[0] : " + scoreList[2]);
        System.out.println("scoreList[0] : " + scoreList[3]);
        System.out.println("scoreList[0] : " + scoreList[4]);

    }
}

for(데이터타입 참조변수 : 배열참조변수) {
	반복 수행문;
}
public class Main {
    public static void main(String[] args) {
        int[] scoreList = new int[5];
        scoreList[0] = 76;
        scoreList[1] = 92;
        scoreList[2] = 49;

        for(int score : scoreList) {
            System.out.println(score);
        }

    }
}

728x90

'Language > JAVA' 카테고리의 다른 글

[JAVA] 버블 정렬 알고리즘  (0) 2023.10.18
[JAVA] 참조 변수와 null  (0) 2023.10.18
[JAVA] 이름이 있는 break  (0) 2023.10.18
[JAVA] 데이터 타입 변환  (0) 2023.10.18
[JAVA] 연산자  (1) 2023.10.17

+ Recent posts