JAVA - 클래스

Luna·2022년 11월 30일
0

JAVA

목록 보기
6/32

객체

  • 변수와 메서드를 가지고 있는 것 -> 메인 메모리에 올린 것
  • 속성(field)과 동작(method)으로 구성

클래스의 구성

속성 (Attribute)

  • 필드(field) = 변수(variable) = 항목(item)

변수

  • 데이터 저장
  • private : 변수를 외부에서 직접 처리 못하도록 하는 방법
  • getter / setter : private 선언한 변수에 접근하도록 하기 위한 방법
    ex) Name -> getName(),setName()

메서드 (Method)

  • 동작, 기능(function)

생성자

  • 생성할 때 사용하는 것 new 생성자();
  • 생성자는 메인 메모리에 올리려고 호출하는 것.
  • { 처리문 } : 주로 밖에서 초기값을 전달 받아서 세팅할 때 사용.
  • 기본 생성자
    : 처리문이 없는 생성자. 생성자가 없으면 컴파일러가 기본 생성자를 자동으로 작성해서 넣어준다.
  • new 클래스이름() -> 생성자가 없으면 호출이 안됨.

생성자 작성 규칙

  1. return 타입이 없다. (주소를 리턴한다.)
  2. Class와 같은 이름을 써야 한다. Car car = new Car();
  3. 생성자는 보편적으로 public을 붙여 준다. (다른 패키지에서도 사용 할 수 있게)

객체 지향의 특징

상속 (Inheritance)

  • 상위 객체가 필드와 메소드를 하위 객체에게 물려주어 하위 객체가 사용할 수 있도록 함.

다형성 (Polymorphism)

  • 같은 타입이지만 실행 결과가 다양한 객체를 이용할 수 있는 성질

객체 생성과 클래스 변수

예제

public class Student {
}
public class StudentExample {

	public static void main(String[] args) {
		
		// 참조형 변수 - 주소로 운영
		// new Student() -> 생성자를 이용해서 생성한다. 주소를 s1에 저장한다.
		Student s1 = new Student(); 
		System.out.println("s1 변수에 Student 객체를 생성해서 저장합니다.");
		System.out.println("s1의 hashcode 값 : " + s1); // s21의 toString() 호출해서 문자열로 만든다음 출력한다.
		System.out.println("s1의 identityHashCode 값 : " + System.identityHashCode(s1) + "\n");
		
		// new Student() -> 생성자를 이용해서 생성한다. 주소를 s2에 저장한다.
		Student s2 = new Student();
		System.out.println("s2 변수에 또 다른 Student 객체를 생성해서 저장합니다.");
		System.out.println("s2의 hashcode 값 : " + s2.toString());
		System.out.println("s2의 identityHashCode 값 : " + System.identityHashCode(s2) + "\n");
		
		// 주소값이 같은지 확인
		if(s1 == s2) {
			System.out.println("s1과 s2의 주소는 같다.");
		} else {
			System.out.println("s1과 s2의 주소는 같지 않다.");
		}
	}
}

필드 사용

예제

// 데이터를 저장하는 용도로 작성된 클래스
// 저장 - VO : CarVO, 전달 - DTO : CarDTO, 객체의 정보 : Car
public class Car {
	
	// static이 없어서 자동으로 올라가지 않고 new를 통해 객체를 생성해야 올라간다.
	// 회사, 모델, 색상, 최고 속도, 현재 속도
	String company = "현대자동차";
	String model = "그랜저";
	String color = "검정";
	int maxSpeed = 350;
	int speed;
	
	// new Car()
	public Car() {} // 생성자가 없을 때 컴파일러가 만들어 주는 기본 생성자
	
	// 똑같은 이름인데 전달되는 변수 갯수나 타입에 따라서 구분이 된다.
	// new Car("기아","모하비", "블랙", "200", "0")
	public Car(String company, String model, String color, int maxSpeed, int speed) {
		this.company = company;
		this.model = model;
		this.color = color;
		this.maxSpeed = maxSpeed;
		this.speed = speed;
	} 	
}
public class CarExample {

	//시작
	public static void main(String[] args) {
		
		// Car() 생성자를 이용해서 객체를 생성한다(new). 주소가 나온다. 주소를 myCar에 저장한다.
		// 생성자가 없으면 기본 생성자를 만들고 컴파일 해준다.
		Car myCar = new Car(); // 생성자 없는 객체를 생성, 이미 값이 들어가 있어서 기본적으로 생성이 되어있음. (생략되어 있음)
		Car myCar1 = new Car("기아", "모하비", "블랙", 200, 0); // 생성자 있는 객체 생성해서 값을 넣어줌
		
		// 필드(변수)값을 읽기
		System.out.println("제작회사 : " + myCar.company);
		System.out.println("모델명 : " + myCar.model);
		System.out.println("색깔 : " + myCar.color);
		System.out.println("최고속도 : " + myCar.maxSpeed);
		System.out.println("현재속도 : " + myCar.speed);
		
		System.out.println();
		
		System.out.println("제작회사 : " + myCar1.company);
		System.out.println("모델명 : " + myCar1.model);
		System.out.println("색깔 : " + myCar1.color);
		System.out.println("최고속도 : " + myCar1.maxSpeed);
		System.out.println("현재속도 : " + myCar1.speed);
		
		System.out.println();
		
		// 변경된 값
		myCar.speed = 60;
		System.out.println("수정된 속도 : " + myCar.speed);
	}
}

생성자가 없을 때는 컴파일러가 public Car() 라고 기본 생성자를 생성 해 줘서 굳이 생성자를 만들 필요는 없다. 하지만 인자가 있는 생성자를 하나 더 만든다면 (public Car(String company, String model, String color, int maxSpeed, int speed)) 메인 메서드에서 Car myCar = new Car()를 참조할 생성자가 없기 때문에 기본 생성자도 생성을 해 줘야 한다.


오버로드

예제

public class Car {

	String company = "현대자동차";
	String model = "그랜저";
	String color = "검정";
	int maxSpeed = 350;
	int speed;

	public Car() {
	} 

	public Car(String company, String model, String color, int maxSpeed, int speed) {
		this.company = company;
		this.model = model;
		this.color = color;
		this.maxSpeed = maxSpeed;
		this.speed = speed;
	}
	
	// 어노테이션 : 오버라이딩을 올바르게 했는지 컴파일러가 체크한다.
    // 부모클래스(Object)에서 상속받은 것과 동일한지 체크하는 역할을 한다.
	@Override
    
	// Object에 객체 출력하는 메서드 => toString(){~~} --> Override라고 한다.
	// toString() : 객체의 정보를 문자열로 만든다. 주로 객체 안에 있는 데이터를 확인하기 위해서
	public String toString() { // 형태가 Object 클래스 안에 있는 것과 같아야 한다.
		return "Car[company = " + company + ", model = " + model + ", color = " + color 
				+ ", maxSpeed = " + maxSpeed + ", speed = " + speed + "]";
	} 
}
public class CarExample {
	public static void main(String[] args) {
		
		Car myCar = new Car();
		Car myCar1 = new Car("기아", "모하비", "블랙", 200, 0);
		
		System.out.println(myCar); // public String toString() 호출

	}
}
  • 단순히 데이터를 확인 하기 위해서 Object 클래스에 있는 public String toString() 객체를 생성한다. Object에서 상속받은것이기 때문에 오버라이딩이 이루어졌다. 오버라이딩이 제대로 됐는지 (오탈자는 없는지 등) 확인하기 위헤 @Override를 사용 하면 알 수 있다. Annotation은 오버라이딩을 올바르게 했는지 컴파일러가 체크하는 역할을 한다.
  • 메인 메서드에서 System.out.println(myCar);을 출력하면 Car class에서 선언된 public String toString() 의 리턴값을 출력한다.
    => Car[company = 현대자동차, model = 그랜저, color = 검정, maxSpeed = 350, speed = 0]

Getter와 Setter 메소드

  • 변수에 직접 접근하는 것을 막아줌

    private String name; 에 대한 getter setter 메소드 만들기
    getter public String getName() { return name; }
    setter public void setName (String name) { this.name = name; }

예제 1

public class Car {

	// public - 다른 패키지에서 사용 가능
	// private - Car Class 안에서만 사용 가능
	private String company = "현대자동차";
	private String model = "그랜저";
	private String color = "검정";
	private int maxSpeed = 350;
	private int speed;

	// new Car()
	public Car() {
	}

	public Car(String company, String model, String color, int maxSpeed, int speed) {
		this.company = company;
		this.model = model;
		this.color = color;
		this.maxSpeed = maxSpeed;
		this.speed = speed;
	}
	
	// getter와 setter
	// company 데이터 가져가는 메서드 - 다른 위치에서도 사용 가능하다.
	public String getCompany() {
		return company;
	}
	// company 데이터 넣어주는 메서드 - 다른 위치에서도 사용 가능하다.
	public void setCompany(String company) {
		this.company = company;
	}
	
	public String getModel() {
		return model;
	}

	public void setModel(String model) {
		this.model = model;
	}

	public String getColor() {
		return color;
	}

	public void setColor(String color) {
		this.color = color;
	}

	public int getMaxSpeed() {
		return maxSpeed;
	}

	public void setMaxSpeed(int maxSpeed) {
		this.maxSpeed = maxSpeed;
	}

	public int getSpeed() {
		return speed;
	}

	public void setSpeed(int speed) {
		this.speed = speed;
	}

} 

public class CarExample {

	public static void main(String[] args) {
		
		Car myCar = new Car();
		Car myCar1 = new Car("기아", "모하비", "블랙", 200, 0);
		
		// 필드(변수)값을 읽기
		System.out.println("제작회사 : " + myCar.getCompany());
		System.out.println("모델명 : " + myCar.getModel());
		System.out.println("색깔 : " + myCar.getColor());
		System.out.println("최고속도 : " + myCar.getMaxSpeed());
		System.out.println("현재속도 : " + myCar.getSpeed());
		
		System.out.println("제작회사 : " + myCar1.getCompany());
		System.out.println("모델명 : " + myCar1.getModel());
		System.out.println("색깔 : " + myCar1.getColor());
		System.out.println("최고속도 : " + myCar1.getMaxSpeed());
		System.out.println("현재속도 : " + myCar1.getSpeed());
		
		myCar.setCompany("기아");
		System.out.println("수정된 회사 : " + myCar.getCompany());
	}
}

getter메서드는 데이터를 읽어올 수 있게 해주고, setter 메서드는 데이터를 넣을 수 있게 (수정할 수 있게) 해준다. public을 사용하지 않고 굳이 private를 줘서 getter와 setter 메서드를 사용하는 이유가 몇가지 있는데 블로그 링크를 걸어놓고 나중에 따로 정리 해야겠다.
getter와 setter 사용하는 이유 - 블로그 링크

0개의 댓글