클래스

nana·2024년 7월 15일
0

JAVA

목록 보기
3/5

클래스와 객체

1. 클래스

  • 객체를 정의해 놓은 것 (사용자 정의 타입)
  • 객체를 생성하는데 사용된다.
  • 변수와 함수를 묶어서 사용 가능하다.

2. 객체

  • 실제로 존재하는 것
  • 객체의 속성과 기능에 따라 다르다.

3. 인스턴스

  • 객체는 인스턴스를 포함하는 일반적인 의미
  • 인스턴스화 : 클래스로부터 인스턴스를 생성하는 것

클래스 -> 인스턴스(객체)
=> 인스턴스화

4. 객체의 구성요소

객체는 속성과 기능으로 이루어져 있다.

  • 속성 : 변수
  • 기능 : 메서드 (클래스에서 제공하는 기능)
class Person {
	int age;		// 변수
	String name;
	double height;
	
	String info() {		// 메소드
		return String.format("나이:%d, 키:%.1f", age, height);
	}	
}

public class ClassTest1 {
	public static void main(String[] args) {
		Person p1 = new Person();	// reference type		
		p1.age = 30;
		p1.height = 175.3;
		
		Person p2 = new Person();
		p2.age = 35;
		p2.height = 165.3;
		
		System.out.println(p1.info());
		System.out.println(p2.info());	
	}
}

변수와 메서드

1. 선언위치에 따른 변수의 종류

변수의 선언위치가 변수의 종류와 범위(scope)을 결정한다.

class Variables {
	int iv;					// 인스턴스 변수
    static int cv;			// 클래스변수(static변수, 공유변수)
    
    void method() {
    	int lv = 0;			// 지역변수
    }
}

1) 클래스 영역

  • 클래스변수 (static 변수)

    클래스가 메모리에 올라갈 때 (프로그램이 시작하는 시점)에 생성, 프로그램이 종료될 때 소멸됨
    같은 클래스의 모든 인스턴스들이 공유하는 변수 (공유변수)
  • 인스턴스 변수

    인스턴스 생성시 생성, 참조변수가 없을때 가비지컬렉터에 의해 자동 제거됨

2) 메서드 영역

  • 지역변수

    메서드 내에 선언되고 메서드가 종료될 때 소멸됨
    조건문, 반복문의 블럭{}내에 선언된 지역변수는 블럭을 벗어나면 소멸

2. 메서드

  • 메서드란 작업을 수행하기 위한 명령문의 집합이다.
  • 반복적인 코드를 줄이고 코드의 관리가 용이하다.
  • 하나의 메서드는 한 가지 기능만 수행하도록 작성하는 것이 좋다.
int add(int a, int b) {
	int result = a + b;
    return result;
}

void power() {		// return값이 없는 경우 void 사용
	power = !power;
}

메서드 호출방법

참조변수.메서드 이름();		
참조변수.메서드 이름(1,2, ...);	// 메서드에 선언된 매개변수가 있는 경우

class MyMath {
	int add(int a, int b) {
    	int result = a + b;
        return result;
    }
}

MyMath mm = new myMaht();
int value = mm.add(1, 2);	// 메서드 호출

3. return문

현재 실행 중인 메서드를 종료하고 호출한 메서드로 되돌아간다.
반환값이 있는 메서드는 모든 경우에 return문이 필요하다.

int max(int a, int b) {
	if (a > b)
    	return a;	=> 오류
}

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

return문의 개수는 최소화하는 것이 좋다.

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

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

4. 메서드 오버로딩

하나의 클래스에 같은 이름의 메서드를 여러 개 정의하는 것

  • 메서드의 이름이 같아야 한다.
  • 매개변수의 개수 또는 타입이 달라야 한다.
  • 매개변수는 같고 리턴타입이 다른 경우는 오버로딩이 성립하지 않는다.

오버로딩 예시

// 매개변수는 다르지만 같은 의미의 기능 수행
int add(int a, int b) {
	return a + b;
}

long add (long x, long y) {
	return x + y;
}

생성자

1. 생성자란?

인스턴스가 생성될 때마다 호출되는 ‘인스턴스 초기화 메서드

인스턴스 변수의 초기화 또는 인스턴스 생성 시 수행할 작업에 사용된다.

모든 클래스에는 반드시 하나 이상의 생성자가 있어야 한다.

예시

Card c = new Card();

  1. 연산자 new에 의해 메모리(heap)에 Card 클래스의 인스턴스가 생성된다.
  2. 생성자 Card()가 호출되어 수행된다.
  3. 연산자 new의 결과로, 생성된 Card 인스턴스의 주소가 반환되어 참조변수 c에 저장된다.

2. 생성자의 조건

  • 생성자의 이름은 클래스의 이름과 같아야 한다.
  • 생성자는 리턴값이 없다. 그러나 void를 사용하지 않는다.
class Card {
	...
    
    Card() {	// 매개변수가 없는 기본 생성자
    	...
    }
    
    Card(String kind, int number) {		// 매개변수가 있는 생성자
    	...
    }
}

1) 기본 생성자

모든 클래스에는 반드시 하나 이상의 생성자가 있어야 한다.

기본 생성자는 매개변수가 없는 생성자로, 클래스에 생성자가 하나도 없으면 컴파일러가 기본 생성자를 추가한다.

Card() {}	// 컴파일러에 의해 추가된 Card클래스의 기본 생성자

2) 매개변수가 있는 생성자

class Car {
	String color;
    String gearType;
    int door;
    
    Car() {}
    Car(String c, String g, ind d){
    	color = c;
        gearType = g;
        door = d;
    }
}

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

3. this

1) 생성자에서 다른 생성자 호출

this()는 생성자, 같은 클래스의 다른 생성자를 호출할 때 사용한다.

다른 생성자의 호출은 생성자의 첫 문장에서만 가능하다.

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

2) 참조변수 this

this는 인스턴스 자신을 가리키는 참조변수로 사용된다.

인스턴스의 주소가 저장되어있고, 모든 인스턴스 메서드에 지역번수로 숨겨진 채 존재한다.

class Car {
	String color;
    String gearType;
    int door;
    
    Car(String color, String gearType, int door){
    	this.color = color;
        this.gearType = gearType;
        this.door = door;
    }
}

변수의 초기화

1. 변수의 초기화

변수를 선언하고 처음으로 값을 정하는 것을 초기화라고 한다.

멤버변수 (인스턴스 변수, 클래스 변수)와 배열은 각 타입의 기본값으로 자동 초기화 되므로 초기화를 생략할 수 있다.

그러나 지역변수는 사용전에 초기화를 필수로 해주어야 한다.

class InitTest{
	int x;		// 인스턴스 변수
    int y = x;
    
    void method1() {
    	int i;
        int j = i;   => 에러) 지역변수를 초기화하지 않고 사용함
    }
    
    void method2() {
    	int i = 10;
        int j = i;  
    }
}

2. 멤버변수의 초기화

1) 명시적 초기화

class Car {
	int door = 4;				// 기본형 변수의 초기화
    Engine e = new Engine();	// 참조형 변수의 초기화
}

2) 생성자

class Car {
	...
    
    Car(Sting color, String gearType, int door) {
    	this.color = color;
        this.gearType = gearType;
        this.door = door;
    }
}

3) 초기화 블럭

  • 인스턴스 초기화 블럭 : {}
  • 클래스 초기화 블럭 : static {}
profile
프론트엔드 개발자 도전기

0개의 댓글