[ Java 기초 ] 클래스

황승환·2021년 12월 28일
0

Java 기초

목록 보기
5/6
post-thumbnail

Goal

자바의 Class 학습하기

Study

객체 지향 포르그래밍에서는 모든 데이터를 객체(Object)로 취급하며 이러한 객체가 바로 프로그래밍의 중심이 된다. 이러한 객체의 상태(state)와 행동(behavior)을 구체화하는 형태의 프로그래밍이 바로 객체 지향 프로그래밍이다.

자바에서 클래스란 객체를 정의하는 틀 또는 설계도와 같은 의미로 사용된다. 자바에서는 클래스를 가지고 여러 객체를 생성하여 사용한다.

클래스 (Class)

클래스란 객체 지향 프로그래밍의 추상화라는 개념을 직접 구현한 것이라고 할 수 있다. 자바에서 개발자의 편의를 위해 유용하게 사용할 수 있는 많은 수의 클래스를 미리 정의하여 제공하고 있다. 또한 개발자가 원하는 동작을 수행하는 새로운 클래스를 손쉽게 작성 가능하다.

접근제어자 class 클래스명 {
	접근제어자 필드1의타입 필드1의이름;
    접근제어자 필드2의타입 필드2의이름;
    ...
    접근제어자 메소드1의원형
    접근제어자 메소드2의원형
    ...
};

위와 같은 형태로 클래스 정의가 가능하다. 이에 대한 예시 코드는 다음과 같다.

public class Car {
	public String modelName;
    public int modelYear;
    ...
    public void brake() {}
    public void handing() {}
    ...
}

객체

객체의 설계도에 해당하는 클래스가 정의 되었다면 이를 이용하여 객체를 생성, 할당하고 사용할 수 있다. 클래스로부터 만들어진 객체를 그 클래스의 인스턴스라고 한다.

객체를 사용하기 위해서는 생성과 할당 과정이 필요하다.

객체 생성

클래스명 객체참조변수명;

Car myCar;

객체 할당

  1. new 연산자가 myCar 객체에 저장될 메모리 공간을 할당한다.
  2. 생성자가 myCar 객체를 초기화한다.
  3. new 연산자가 새로 생성된 객체의 주소(reference) myCar 변수에 저장한다.
  4. myCar을 통해 Car에 접근할 수 있게 된다.

객체참조변수명 = new 클래스명();

niceCar = new Car();

객체 생성과 할당 통합

클래스명 객체참조변수명 = new 클래스명();

Car niceCar = new Car();

객체 사용

  • 객체 안에 포함된 변수의 값을 다른 변수에 복사
    값 = 객체명.멤버변수;
  • 객체 안에 포함된 변수의 값에 다른 값 대입
    객체명.멤버변수 = 값
  • 객체 안에 포함된 메서드 호출
    객체명.메서드명();
  • 객체 안에 포함된 메서드에 파라미터 전달
    객체명.메서드명(값1, 값2, ...);

Example

class Car { // 클래스 정의
	String modelName;
    	int modelYear;
        int carNumber;
}
public class Main {
	public static void main(String[] args) {
    	Car myCar; // 객체 생성
        myCar = new Car(); // 객체 할당
        // 객체의 멤버변수에 값 부여
        myCar.modelName = "car1"; 
        myCar.modelYear = "2022";
        myCar.carNumber = "1111";
        
        Car yourCar; // 객체 생성
        yourCar = new Car(); // 객체 할당
        // 객체의 멤버변수에 값 부여
        yourCar.modelName = "car2";
        yourCar.modelYear = "2017";
        yourCar.carNumber = "2222";
        // myCar, yourCar은 서로 다른 객체이므로 다른 값을 가짐.
        System.out.println("모델명: " + myCar.modelName + "출시년도" + myCar.modelYear + "차번호" + myCar.carNumber);
        System.out.println("모델명: " + yourCar.modelName + "출시년도" + yourCar.modelYear + "차번호" + yourCar.carNumber);
	}
}

메소드 (Method)

자바에서 클래스는 멤버로 속성을 표현하는 필드(field)와 기능을 표현하는 메소드(method)를 가진다. 메소드란 어떠한 특정 작업을 수행하기 위한 명령문의 집합이라고 할 수 있다.

메소드 사용 목적

  • 중복되는 코드의 반복을 없애 코드의 길이를 줄일 수 있다.
  • 모듈화로 인하여 코드의 가독성이 좋아지게 된다.
  • 프로그램에 문제가 발생하거나 기능의 변경이 필요할 때에 손쉽게 유지보수가 가능하다.

메소드를 작성할 때에는 되도록 하나의 메소드는 하나의 기능만을 수행하도록 작성하는 것이 좋다.

메소드 정의

클래스에서 메소드를 정의하는 것은 일반 함수를 정의하는 것과 비슷하다.

 접근제어자 반환타입 메소드명(매개변수목록) { // 선언부
 // 구현부
 }
  • 접근제어자
    해당 메소드에 접근할 수 있는 범위를 명시
  • 반환 타입(return type)
    메소드가 모든 작업을 수행하고 반환하는 데이터의 타입을 명시
  • 메소드명
    메소드를 호출할 때에 사용할 이름 명시
  • 매개변수 목록(parameters)
    메소드 호출 시에 전달되는 인수의 값을 저장할 변수들을 명시
  • 구현부
    메소드의 기능을 수행하는 로직 명시. (명령문의 집합)
class Car {
	String modelName;
    	int modelYear;
        int carNumber;
        public int carOld(int currentYear) { // 선언부
            // 구현부
            int old = (currentYear + 1) - this.modelYear;
            return old;
        }
}

public 접근 제어자를 이용하여 선언되었기 때문에 해당 객체를 사용하는 프로그램 어디에서나 접근이 가능하다. 반환 타입은 int로 주었고 클래스 내에서 정의된 modelYear과 새롭게 입력받은 매개변수 currentYear를 이용하여 결과를 도출한다.

메소드 호출

위와 같이 정의한 메소드는 멤버 참조 연산자 (.)를 이용하여 호출할 수 있다.
객체참조변수명.메소드명();

Car myCar = new Car(); // 객체 생성 & 할당
// 객체의 멤버변수에 값 부여
myCar.modelName = "car1"; 
myCar.modelYear = "2022";
myCar.carNumber = "1111";
System.out.println(myCar.carOld(2021) + "년된 차입니다."); //myCar 객체의 carOld 메소드 호출

Example

class Car { // 클래스 정의
	String modelName;
    	int modelYear;
        int carNumber;
        public int carOld(int currentYear) { // 선언부
            // 구현부
            int old = (currentYear + 1) - this.modelYear;
            return old;
        }
}
public class Main {
	public static void main(String[] args) {
    	Car myCar; // 객체 생성
        myCar = new Car(); // 객체 할당
        // 객체의 멤버변수에 값 부여
        myCar.modelName = "car1"; 
        myCar.modelYear = "2022";
        myCar.carNumber = "1111";
        
        Car yourCar; // 객체 생성
        yourCar = new Car(); // 객체 할당
        // 객체의 멤버변수에 값 부여
        yourCar.modelName = "car2";
        yourCar.modelYear = "2017";
        yourCar.carNumber = "2222";
        
        System.out.println("모델명: " + myCar.modelName + "출시년도" + myCar.modelYear + "차번호" + myCar.carNumber);
        System.out.println(myCar.carOld(2021) + "년된 차입니다."); // 메소드 호출
        System.out.println("모델명: " + yourCar.modelName + "출시년도" + yourCar.modelYear + "차번호" + yourCar.carNumber); 
        System.out.println(yourCar.carOld(2021) + "년된 차입니다."); // 메소드 호출
	}
}

생성자 (Constructor)

자바에서는 객체의 생성과 동시에 인스턴스 변수를 원하는 값으로 초기화 할 수 있는 생성자 메소드를 제공한다. 생성자명은 해당 클래스명과 같아야한다. 생성자는 다음과 같은 특징을 가진다.

  • 생성자는 반환값이 없지만, 반환 타입을 void형으로 선언하지 않는다.
  • 생성자는 초기화를 위한 데이터를 인수로 전달받을 수 있다.
  • 객체를 초기화하는 방법이 여러개 존재할 경우 하나의 클래스가 여러개의 생성자를 가질 수 있다. 이는 생성자도 메소드이므로 메소드 오버로딩이 가능하다는 것을 의미한다.

생성자 정의

생성자는 다음과 같은 형식으로 정의할 수 있다.

클래스명() { ... } // 매개변수가 없는 생성자
클래스명(인수1, 인수2, ...) { ... } // 매개변수가 있는 생성자
Car(String modelName, int modelYear, int carNumber, String color, String maxSpeeds) {
	this.modelName = modelName;
    	this.modelYear = modelYear;
        this.carNumber = carNumber;
	this.color = color;
    	this.maxSpeeds = maxSpeeds;
}

위와 같이 생성자는 반환값을 명시하지 않아야한다.

생성자 호출

자바에서는 new 키워드를 사용하여 객체를 생성할 때 자동으로 생성자가 호출된다.

class Car {
	String modelName;
    	int modelYear;
        int carNumber;
        String color;
        int maxSpeeds;
        
        Car(String modelName, int modelYear, int carNumber, String color, int maxSpeeds) {
        	this.modelName = modelName;
            	this.modelYear = modelYear;
        	this.carNumber = carNumber;
		this.color = color;
    		this.maxSpeeds = maxSpeeds;
	}
    
    	public String modelInfo() {
        	return this.modelYear + "년식" + this.modelName + "" + this.color + "최고속도" + maxSpeeds;
        }
}

public class Main {
	public static void main(String[] args) {
    	Car myCar = new Car("그랜저", 2020, 1111, "흰색", 200); // 생성자 호출
        System.out.println(myCar.modelInfo()); // 생성자에 의해 초기화된 정보 출력
        }
}

기본 생성자 (Default constructor)

자바의 모든 클래스에는 하나 이상의 생성자가 정의되어 있어야 한다. 하지만 특별히 생성자를 정의하지 않아도 객체를 생성할 수 있다. 자바 컴파일러가 기본 생성자를 기본적으로 제공하기 때문이다. 기본 생성자는 매개변수, 명령어 모두를 갖지 않는다.

클래스이름() {}
이는 개발자가 따로 생성자를 정의하지 않았을 때에 자바 컴파일러에서 자동으로 정의해주는 기본 생성자의 형식이다.

class Car {
	String modelName = "그랜저"
   	int modelYear = "2020"
    String color = "흰색"
    
    public String modelInfo(){
    	return this.modelYear + "년식" + this.color + "" + this.modelName;
    }
}

public class Main {
	public static void main(String[] args) {
    	Car myCar = new Car(); // 기본 생성자 호출
        System.out.println(myCar.modelInfo()); // 클래스 내부에서 정의된 멤버변수 출력됨
	}
}

위의 코드에서 myCar은 기본 생성자를 사용하여 생성된다. 이 생성자는 아무런 동작을 하지 않기 때문에 클래스 필드에서 멤버변수를 바로 초기화하였다.

this 키워드

자바에서 this는 참조 변수로써의 this와 메소드로써의 this()로 존재한다.

this 참조 변수

this 참조 변수는 객체가 바로 자기 자신을 참조하는데에 사용하는 변수이다. this 참조 변수는 해당 객체의 주소를 가리킨다.

class Car {
	String modelName;
    	int modelYear;
        int carNumber;
        String color;
        int maxSpeeds;
        
        Car(String modelName, int modelYear, int carNumber, String color, int maxSpeeds) {
        	this.modelName = modelName;
            	this.modelYear = modelYear;
        	this.carNumber = carNumber;
		this.color = color;
    		this.maxSpeeds = maxSpeeds;
	}
}

앞에서 사용한 생성자 함수를 보면 this 참조 변수를 통해 자기 자신을 참조하는 것을 볼 수 있다. 이처럼 생성자의 매개변수명과 인스턴스 변수명이 같을 경우에는 인스턴스 변수 앞에 this키워드를 붙여야 한다.

this 참조 변수를 사용하여 인스턴스 변수에 접근할 수 있다. this 참조 변수는 인스턴스 메소드에서만 사용이 가능하고 (클래스 메소드에서는 사용 불가) 모든 인스턴스 메소드에는 this 참조 변수가 숨겨진 지역 변수로 존재한다.

this() 메소드

this() 메소드는 생성자 내부에서만 사용할 수 있고 같은 클래스의 다른 생성자를 호출할 때에 사용한다. this() 메소드에 인수를 전달하면 생성자 중 메소드 시그니처가 일치하는 다른 생성자를 찾아 호출한다. (메소드 시그니처란 메소드의 이름과 메소드의 원형에 명시되는 매개변수 리스트를 의미한다.)

Example

class Car {
	String modelName;
    	int modelYear;
    	int car Number;
        String color;
        int maxSpeed;
        
        Car(String modelName, int modelYear, int carNumber, String color, int maxSpeeds) {
        	this.modelName = modelName;
            	this.modelYear = modelYear;
        	this.carNumber = carNumber;
		this.color = color;
    		this.maxSpeeds = maxSpeeds;
	}
    	
        Car() {
        	this("그랜저", 2020, 1111, "흰색", 200); // 다른 생성자 호출
        }
        
        public String modelInfo() {
        	return this.modelYear + "년식" + this.modelName + "" + this.color + "최고속도" + maxSpeeds;
        }
}

public class Main {
	public static void main(String[] args) {
    	Car myCar = newCar();
        System.out.println(myCar.modelInfo());
    }
}

위의 코드에서 매개변수를 가지는 첫번째 생성자는 this 참조 변수를 사용하여 인스턴스 변수에 접근한다. 매개변수를 가지지 않는 두번째 생성자는 내부에서 this() 메소드를 사용하여 첫번째 생성자를 호출한다.

한 생성자에서 다른 생성자를 호출할 때에는 반드시 해당 생성자의 첫 줄에서만 호출할 수 있다는 점을 주의해야 한다.

profile
꾸준함을 꿈꾸는 SW 전공 학부생의 개발 일기

0개의 댓글