객체의 생성

클래스로부터 객체를 생성하기 위해서는 new라는 예약어를 사용해야 한다. new는 객체 생성 연산자이다. 

new 생성자();

다음은 Student 클래스로부터 객체를 생성하는 과정이다.

public class Student {
	String name;
    int score;
}


new Student();

 클래스로부터 객체를 생성할 때 생성자가 자동으로 호출되는데, 이때 클래스의 멤버 변수가 초기화된다. 클래스로부터 객체를 생성하는 것은 배열 객체를 생성하는 것과 비슷하다. 다만 배열은 동일한 타입의 데이터만 저장할 수 있지만, 클래스는 다른 타입의 데이터도 저장할 수 있다. 이는 클래스에 선언된 멤버 변수들의 타입이 다르기 때문이다.

 

객체의 사용

클래스로부터 생성된 객체는 배열과 동일하게 참조 변수를 통해서만 접근할 수 있다. 참조 변수에 생성된 객체의 주소를 할당하는 과정은 다음과 같다.

클래스이름 참조변수;
참조변수 = new 생성자();

// 예시
Student kim;
kim = new Student();

Student lee = new Student();

 

이제 kim이라는 참조 변수를 통해서 메모리에 생성된 Student 객체에 접근할 수 있고, Student 객체에 포함된 멤버 변수를 사용할 수 있다. 

 

public class StudentTest {
    public static void main(String[] args) {
        Student kim = new Student();
        kim.name = "둘리";
        kim.score = 83;
        
        System.out.println("이름 : "+kim.name); // 둘리
        System.out.println("성적 : "+kim.score); // 83
    }
}


class Student {
    String name;
    int score;
}

먼저 생성자를 통해 Student 클래스의 객체를 생성했다. 그리고 kim 이라는 참조 변수를 통해 Student 객체에 포함된 name과 score 변수에 각각 "둘리", 83 이라는 값을 할당했다. 그리고 나서 Student 객체가 가진 name, score 변수의 값을 출력했다.

 

728x90

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

[JAVA] 패키지  (0) 2023.10.19
[JAVA] 접근 제어자  (0) 2023.10.19
[JAVA] 클래스 Class (2)  (0) 2023.10.18
[JAVA] 클래스 Class (1)  (0) 2023.10.18
[JAVA] 버블 정렬 알고리즘  (0) 2023.10.18

클래스

클래스는 현실 세계의 객체를 추상화하여 소스 코드 형태로 만든 결과물이며, 자바 프로그램의 가장 기본이다. 이런 클래스의 구조와 문법에 대해서 구체적으로 살펴보자.

 

클래스의 구조

클래스는 class 라는 예약어를 사용하여 선언하며, 클래스의 일반적인 구조는 다음과 같다.

// 클래스 선언부
class 클래스 이름 {
	// 멤버 변수 선언
    
    // 생성자 메소드 선언
    
    // 메소드 선언
}

먼저 class 라는 예약어 뒤에 클래스 이름이 온다. 그리고 클래스 이름 뒤에는 클래스에 대한 시작 블록이 등록하고, 이 블록 안쪽에 클래스의 구성 요소들이 선언된다.

 

클래스는 멤버 변수, 생성자 메소드 그리고 일반 메소드로 구성되며, 각 요소의 순서는 바뀔 수 있다. 즉, 멤버 변수가 맨 아래 선언돼도 상관없다는 의미다. 하지만 일반적으로는 위 순서대로 작성하는 것이 가독성 측면에서 바람직하다.

 

위와 같은 구조로 학생에 해당하는 Student 클래스를 작성한다면 다음과 같은 형태가 될 것이다.

//  1. 클래스 선언
class Student {
    // 2. 멤버 변수 선언
    String name;
    int score;
    
    // 3. 생성자 메소드
    Student() {
        System.out.println("---> Student 객체 생성");
    }
    
    // 4. 메소드
    void printInfo() {
        System.out.println(name + "의 점수 : "+ score);
    }



}

 

자바는 하나의 파일에 하나의 클래스를 작성하는 것을 원칙으로 한다. 가끔 테스트를 목적으로 하나의 파일에 여러 클래스를 작성하기도 하지만, 이런 경우 public 예약어가 붙은 클래스는 하나만 지정할 수 있다. 그리고 반드시 다음과 같이 public 예약어가 붙은 클래스를 파일 이름으로 지정해야 한다.

public class MainClass {
	
}

class subClass {
}

 하나의 파일에 여러 클래스를 작성한 경우, 자바 파일은 MainClass.java 로 하나지만 컴파일 결과로 만들어진 .class 파일은 클래스 수 만큼 만들어진다.

즉 위 코드를 컴파일하면 MainClass.class, subClass.class 두개의 클래스가 만들어진다.

 

클래스 선언부

클래스 선언부에는 가장 먼저 class 라는 예약어가 등장한다. class는 지금부터 새로운 클래스가 정의된다는 것을 JVM에게 알려준다. class 예약어 뒤에 나오는 Student 가 클래스 이름이며, 클래스 이름은 대문자로 시작한다는 것만 제외하면 변수 이름 규칙과 동일한 규칙을 적용받는다.

 

멤버 변수

클래스 선언부 바로 밑에는 가장 먼저 멤버 변수가 등장한다. 멤버 변수는 클래스에 속한 변수라고 하여 '클래스 변수' 또는 '필드' 라고 하는데, 우리는 이후에 진행되는 모든 설명과 실습에서 멤버 변수로 통일하여 부를 것이다.

 

멤버 변수는 우리가 알고 있는 일반 변수와 동일하다. 다만 지금까지 사용했던 변수가 main()이라는 특수한 메소드 안에서만 선언되고 사용됐던 로컬 변수라면, 멤버 변수는 main() 메소드가 아닌 다른 메소드에서도 사용할 수 있는 글로벌 변수이다. 심지어 다른 클래스에서도 사용할 수 있다.

 

래스에서 멤버변수가 중요한 이유는 클래스로부터 객체가 생서될 때 객체에 포함되는 유일한 요소이기 때문이다. 즉, 클래스로부터 생성된 객체는 생성자 메소드나 일반 메소드는 포함하지 않고 오직 멤버 메소드만 포함한다.

 

우리가 프로그램에서 객체를 이용한다는 것은 결국 멤버 변수에 할당된 데이터를 이용한다는 것을 의미한다. 또한 클래스에 포함된 생성자나 메소드는 모두 멤버 변수를 위해 존재한다.

 

생성자 메소드

멤버 변수 다음에 등장하는 것이 생성자(constructor)메소드다. 생성자 라고도 부른다. 생성자는 클래스 이름과 동일한 이름을 가지고 있으며, 기능적으로는 멤버 변수의 초기화를 담당한다. 

생성자 역시 큰 범위에서 보면 메소드에 해당하기 떄문에 누군가에 의해 호출되어야만 한다. 생성자가 호출되는 시점은 클래스로부터 객체(인스턴스)를 생성할 때다. 즉, 생성자를 통해 클래스로부터 객체를 생성할 수 있으며, 이때 객체에 포함되는 멤버변수 초깃값을 갖게 된다. 

 

메소드

클래스 마지막에 선언된 것이 메소드인데, 메소드를 함수(function)와 동일한 개념으로 이해하면 쉽다. 즉, 메소드는 객체가 제공하는 동사적 특징인 기능이다. 클래스에 선언된 메소드를 실행하기 위해서는 우선 메소드가 포함된 클래스의 객체가 생성되어야 한다. 그래야 객체를 참조하는 참조변수를 통해서 메소드를 호출할 수 있다.

 

대부분의 메소드는 메소드 이름에 해당하는 기능을 제공하며, 메소드에 포함된 기능이 실행되기 위해서는 데이터가 필요하다. 이런 데이터는 메버 변수에 할당된 데이터를 이용할 수도 있지만, 매개변수를 통해 전달된 데이터를 이용할 수도 있다. 

728x90

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

[JAVA] 접근 제어자  (0) 2023.10.19
[JAVA] 클래스 Class (3)  (0) 2023.10.18
[JAVA] 클래스 Class (1)  (0) 2023.10.18
[JAVA] 버블 정렬 알고리즘  (0) 2023.10.18
[JAVA] 참조 변수와 null  (0) 2023.10.18

객체

객체지향 언어에서 말하는 객체(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

Class

Javascript ES6 이전까지는 비슷한 종류의 객체를 많이 만들어내기 위해 생성자를 사용해 왔으나, ES6 이후에서 Class라는 개념이 도입되면서 Class가 생성자의 기능을 대체하게 된다. 

객체지향언어 ( ex : JAVA, C++ ... 등 ) 을 공부했던 사람들이라면 바로 이해하고 익힐 수 있을 것이라고 생각한다. 

 

Class를 사용하는 가장 큰 이유는 재사용성이다.

예시로 여러 동물들에 대한 정보를 저장해야 한다고 가정할 때 동물들은 기본적으로 "name", "age"라는 속성을 갖고, "walk"라는 method를 갖는다고 가정을 한다면 동물마다 하나하나 해당 속성을 정의하게 되면 동물의 수가 적을 경우에는 간단할 수 있지만 100마리, 1000마리, 10000마리 ... 를 정의한다고 가정하면 매우 시간이 많이 들고 코드의 수가 길어지며 가독성이 떨어질 수 있다.

이렇게 속성이 중복되는 경우 하나의 Class로 해당 속성들을 정의하면 코드가 훨씬 짧아질 뿐만아니라, 가독성 또한 상승된다. 

아래 코드가 그 예시이다.

class Animal {
	constructor(name, age) {
    	this.name = name;
        this.age = age;
        this.position = 0;
    }
	
    Walk() {
    	this.position += 1;
    }
}

const Rabbit = new Animal("토끼",3);
const Dog = new Animal("개",2);

console.log(Rabbit);
Rabbit.Walk();
console.log(Rabbit.position);

console.log(Dog);

 

console.log 출력 값


Class 기본 문법

Class 생성하기

class 생성하는 것은 간단하다. class 다음에 만들고자 하는 class 이름을 입력한 후 중괄호로 닫아주면 된다.

class "className" {

}

let classTest = new "className"();

console.log(classTest);

// console.log 결과 "className" {}

 

Class 초깃값 설정

class의 초깃값은 constructor라는 생성자를 이용하여 설정할 수 있다. class 내부에는 한 개의 constructor만 존재할 수 있으며, 2개 이상 선언 시 아래와 같은 Syntax Error가 발생한다.

Uncaught SyntaxError: A class may only have one constructor

class Animal {
	constructor( name , age , position ) {
    	this.name = name;
        this.age = age;
        this.position = position;
    }
}

const Rabbit = new Animal("rabbit",2,5);

console.log(Rabbit);
// Animal { name : "rabbit", age : 2, position : 5 }

 

Class method 생성/사용

class의 method는 function 형식으로 만들어 준다. 해당 메서드를 사용할 경우 " 객체가 담긴 변수명.메소드() " ( Rabbit.Walk() ) 형식으로 호출 가능하다. 

class Animal {
	constructor( name , age , position ) {
    	this.name = name;
        this.age = age;
        this.position = position;
    }
    
    Walk(){
    	this.position += 1;
    }
}

const Rabbit = new Animal("rabbit",2,5);

console.log(Rabbit);
// Animal { name : "rabbit", age : 2, position : 5 }

Rabbit.Walk();
Rabbit.Walk();

console.log(Rabbit);
// Animal { name : "rabbit", age : 2, position : 7 }

 

class내부에서 메소드를 정의하는 것이 아닌 class 외부에서도 메소드 정의가 가능하다. 그러나 class 자체에 추가하는 것이 아닌 class 객체를 담고 있는 변수에서 추가하는 것이기 때문에 해당 변수외의 또 다른 Animal class 객체를 담고 있는 변수의 경우 외부에서 정의한 메소드 사용이 불가능하다. 

아래 코드를 참고하여 보자.

class Animal {
    constructor( name , age , position ) {
        this.name = name;
        this.age = age;
        this.position = position;
    }

    Walk(){
        this.position += 1;
    }
}

const Rabbit = new Animal("rabbit",2,5);
Rabbit.Jump = function(){
    return `${this.name} jump`
}

console.log(Rabbit);
// Animal { name : "rabbit", age : 2, position : 5 }

Rabbit.Walk();
console.log(Rabbit.Jump()); // rabbit jump

console.log(Rabbit);
// Animal { name : "rabbit", age : 2, position : 6 }

 

extends 상속

class에는 상속이라는 개념을 사용할 수 있다. 예제를 보면 더 쉽고 빠르게 이해할 수 있을 것이다. 

상속받은 class의 속성, method를 모두 사용할 수 있다. 

class Animal {
    constructor( name , age , position ) {
        this.name = name;
        this.age = age;
        this.position = position;
    }

    Walk(){
        this.position += 1;
    }
}

class Rabbit extends Animal {
	Jump(){
    	console.log("Rabbit Jump");
    }
}

class Dog extends Animal {
	Bark(){
    	console.log("Wang Wang!");
    }
}

const dog = new Dog("meonzy",3,10);
const rabbit = new Rabbit("tosun",2,9);

dog.Bark();
dog.Walk();
rabbit.Jump();
rabbit.Walk();

 

super 키워드

super 키워드를 사용하여 자식 class에서 부모 class를 호출할 수 있다. 주로 constructor에서 많이 사용한다.

class Animal {
    constructor( name , age , position ) {
        this.name = name;
        this.age = age;
        this.position = position;
    }

    Walk(){
        this.position += 1;
    }
}

class Rabbit extends Animal {
	constructor(name, age, position, jumpSkill){
    	super(name,age,position);
        this.jumpSkill = jumpSkill;
    }
	Jump(){
    	console.log(`Rabbit ${this.jumpSkill} jump`);
    }
}

class Dog extends Animal {
	Bark(){
    	console.log("Wang Wang!");
    }
}

const dog = new Dog("meonzy",3,10);
const rabbit = new Rabbit("tosun",2,9,"100%);

dog.Bark();
dog.Walk();
rabbit.Jump();
rabbit.Walk();

 

참고 :

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Classes

728x90

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

[ Javascript ] async/await  (0) 2022.03.07
[ Javascript ] Promise  (0) 2022.03.06
[ Javascript ] Set Object  (0) 2022.01.11
[ Javascript ] Map Object  (0) 2022.01.11
[ Javascript ] Array.prototype.includes()  (0) 2022.01.11

+ Recent posts