[JAVA] 클래스

코박·2022년 3월 24일
0

JAVA

목록 보기
2/4
post-thumbnail

1. JAVA 클래스를 정의하는 방법

(1) 클래스의 선언

클래스(class)란 객체 지향 프로그래밍의 추상화(abstraction)라는 개념을 직접 구현.

개발자의 편의를 위해 유용하게 사용할 수 있는 많은 수의 클래스를 미리 정의하여 제공.

또한, 개발자가 원하는 동작을 하는 새로운 클래스를 손쉽게 작성가능

(2) 선언방식

2. 객체 만드는 방법 (new키워드 이해하기)

(1)Object()객체 생성자 함수 사용하기

//비어있는 객체 생성
var person1 = new Object();

//person1객체의 프로퍼티를 할당
person1.name = 'michelle'
person1.age = 27
person1.sayHello = function(){
    console.log(this.name + 'Hello!');
}

console.log(person1);

추후에 추가하고 싶은 프로퍼티가 생긴다면 추가 가능

person1.job = 'developer';
person1.hobby = 'movie';

(2)객체 리터럴 방식 사용하기

var person1 = {
    name : 'michelle',
    age : 27,
    sayHello : function(){
        console.log(this.name + 'Hello!');
    }
};

console.log(person1);

Object()객체 생성자보다 프로퍼티들이 한곳에 모아져 있어 한눈에 보고 파악이 가능

(3)생성자 함수 사용하기

함수를 통해서 객체를 생성하는 방식

이 방식은 java에서 클래스를 만들고 해당 클래스의 객체를 만드는 방식과 유사

function Person(name, age){
	this.name = name;
	this.age = age;
	this.sayHello = function(){
		console.log(this.name + 'Hello!');
	}
};

var person1 = new Person('michelle', 27);
var person2 = new Person('frank', 36);
var person3 = new Person('demi', 27);

(4)new 키워드

new 키워드는 객체를 생성하는 방법 중, 생성자 함수(Constructor) 를 사용하여 객체를 만들 때 함께 쓰는 키워드

생성자 함수 : 새로 만든 객체에 속할 프로퍼티들을 초기화 하는 역할

function bar(){
  this.name = "shinye";
  this.age "27";
}

var foo = new bar();

// 이제 foo객체는 다음과 같아진다.
foo = {
  name:"shinye",
  age:"27"
}

foo.name // "shinye"

new가 하는일

1)새로운 빈 객체를 생성

2)"1)"과정으로 만든 빈 객체의 프로토타입을 설정

3)'this'키워드에 "1)"과정에서 생성한 빈 객체를 대입해 생성자 함수를 실행한다.

3. 메소드 정의하는 방법

(1) 메소드

자바에서 클래스는 멤버(member)로 속성을 표현하는 필드(field)와 기능을 표현하는 메소드(method)를 가짐

그중에서 메소드(method)란 어떠한 특정 작업을 수행하기 위한 명령문의 집합

(2) 메소드 정의

class Car {
    private int currentSpeed;
    private int accelerationTime;
    ...
①  public void accelerate(int speed, int second) { // 선언부
        // 구현부
        System.out.println(second+"초속->시속 "+speed+"로 가속함!!");
    }
    ...
}

(3) 메소드 호출

class Car {
    private int currentSpeed;
    private int accelerationTime;
    public void accelerate(int speed, int second) {
        System.out.println(second + "초간 속도를 시속 " + speed + "로 가속");
    }
}

public class Method01 {
    public static void main(String[] args) {
        Car myCar = new Car();   // 객체 생성
        myCar.accelerate(60, 3); // 메소드 호출
    }
}

자바에서 위와 같은 방법으로 정의한 메소드는 멤버 참조 연산자(.)를 사용하여 호출가능

4. 생성자 정의하는 방법

(1) 생성자

인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메소드'

따라서 인스턴스 변수의 초기화 작업에 사용되고, 인스턴스 생성 시에 실행되어야 할 작업을 위해서 사용

(2) 생성자 특징

1) 생성자의 이름은 클래스의 이름은 같아야함

2) 리턴 값이 없으며, void 또한 사용하지 않음

3) 몇 가지 특징을 제외하면 메소드와 다르지 않음

4) 메소드 처럼 클래스 내에 선언되고, 오버 로딩이 가능하므로 하나의 클래스에 여러 개의 생성자가 존재 가능

(3) 기본 생성자

class Data1 {
	int value;
}

class Data2 {
	int value;

	Data2(int x) { 	// 매개변수가 있는 생성자.
		value = x;
	}
}

class ConstructorTest {
	public static void main(String[] args) {
		Data1 d1 = new Data1();
		Data2 d2 = new Data2(); //에러가 발생한다.
	}
}

컴파일을 할 때, 소스파일의 클래스에 생성자가 하나도 정의되어있지 않으면 컴파일러가 자동으로 기본 생성자를 생성&컴파일

(4) 매개변수가 있는 생성자

class Car {
	String color;		
	String gearType;	
	int door;			

	Car() {}
	Car(String c, String g, int d) { // 매개변수가 있는 생성자
		color = c;
		gearType = g;
		door = d;
	}
}

class CarTest {
	public static void main(String[] args) {
		Car c1 = new Car();
		c1.color = "white";
		c1.gearType = "auto";
		c1.door = 4;

		Car c2 = new Car("white", "auto", 4);

		System.out.println("c1의 color=" + c1.color + ", gearType=" + c1.gearType+ ", door="+c1.door);
		System.out.println("c2의 color=" + c2.color + ", gearType=" + c2.gearType+ ", door="+c2.door);
	}
}

인스턴스를 생성할 때 매개변수가 있는 생성자를 사용한다면 인스턴스를 생성함과 동시에 원하는 값으로 초기화를 할 수 있어 보다 간결하고 직관적

5. this 키워드 이해하기

(1) this() 와 this

생성자 간에 서로 호출이 가능한데, 아래의 조건을 따라야 한다.

-생성자의 이름으로 클래스 이름 대신 this를 사용해야함

-한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다.

(2) this 예제

class Car {
	String color;		
	String gearType;	
	int door;			

	Car() {
		this("white", "auto", 4);	
	}

	Car(String color) {
		this(color, "auto", 4);
	}
	Car(String color, String gearType, int door) {
		this.color    = color;
		this.gearType = gearType;
		this.door     = door;
	}
}

class CarTest2 {
	public static void main(String[] args) {
		Car c1 = new Car();	
		Car c2 = new Car("blue");

		System.out.println("c1의 color=" + c1.color + ", gearType=" + c1.gearType+ ", door="+c1.door);
		System.out.println("c2의 color=" + c2.color + ", gearType=" + c2.gearType+ ", door="+c2.door);
	}
}

생성자 Car()에서 또 다른 생성자 Car(String color, String gearType, int door)을 호출

이렇게 생성자 간의 호출에서는 생성자 이름 대신 this를 사용

그리고 Car()의 첫 번째 줄에서 호출

(3) this 장점

같은 클래스 내의 생성자들은 일반적으로 서로 관계가 깊은 경우가 많아서 이렇게 연결하고 호출하는 방식으로 구현하면 더 효율적이고, 유지보수도 쉬움

profile
웹 개발자 할래요

0개의 댓글