본문 바로가기

BackEnd/Java

[java] 이것이 자바다 ch06 클래스

728x90
반응형

1. 객체 지향 프로그래밍

   ▷ 객체(object) : 물리적으로 존재하거나 개념적인 것 중에서 다른 것과 식별 가능한 것입니다.

   ▷ 객체는 속성과 동작으로 구성합니다. 자바는 이러한 속성과 동작을 각각 필드와 메소드라고 합니다.

 

◎ 객체 지향 프로그래밍(OOP) : 객체들을 먼저 만들고 이 객체들을 하나씩 조립해서 완성된 프로그램을 만드는 기법입니다.

 

◎ 객체의 상호 작용

   ▷ 객체 지향 프로그램에서도 객체들은 다른 객체와 서로 상호작용하면서 동작합니다.

   ▷ 객체가 다른 객체의 기능을 이용할 때 이 메소드를 호출해 데이터를 주고 받습니다.

   ▷ 매개값 : 객체가 전달하고자 하는 데이터이며, 메소드 이름과 함께 괄호() 안에 기술합니다.

   ▷ 리턴값 : 메소드의 실행 결과이며, 호출한 곳으로 돌려주는 값입니다.

 

◎ 객체 간의 관계

   ▷ 집합 관계 : 완성품과 부품의 관계입니다.

   ▷ 사용 관계 : 다른 객체의 필드를 읽고 변경하거나 메소드를 호출하는 관계입니다.

   ▷ 상속 관계 : 부모와 자식 관계. 필드, 메소드를 물려받습니다.

 

◎ 객체 지향 프로그래밍의 특징

   ▷ 캡슐화 : 객체의 데이터(필드), 동작(메소드)을 하나로 묶고 실제 구현 내용을 외부에 감추는 것입니다.

   ▷ 상속 : 부모 객체가 자기 필드와 메소드를 자식 객체에게 물려줘 자식 객체가 사용할 수 있게 합니다.

      → 코드 재사용성을 높이고 유지 보수 시간을 최소화합니다.

   ▷ 다형성 : 사용 방법은 동일하지만 실행 결과가 다양합니다.

 

 

2. 클래스와 인스턴스

   ▷ 객체 지향 프로그래밍에서도 객체를 생성하려면 설계도에 해당하는 클래스가 필요합니다.

   ▷ 클래스로부터 생성된 객체를 해당 클래스의 인스턴스라고 부릅니다.

   ▷ 클래스로부터 객체를 만드는 과정을 인스턴스화라고 합니다.

   ▷ 동일한 클래스로부터 여러 개의 인스턴스를 만들 수 있습니다.

      ▶ 동일한 모델이지만 인스턴스는 다릅니다.(번호판)

 

 

 

3. 클래스 선언

   ▷ 객체를 생성(생성자)하고, 객체가 가져야 할 데이터(필드)가 무엇이고, 객체의 동작(메소드)은 무엇인지를 정의합니다.

   ▷ 클래스 선언은 소스 파일명과 동일하게 작성합니다.

   ▷ 클래스명은 첫 문자를 대문자로 하고 캐멀 스타일로 작성합니다.

      ▶ 숫자를 포함해도 되지만 첫 문자는 숫자가 될 수 없고, 특수 문자 중 $, _를 포함할 수 있습니다.

   ▷ 공개 클래스 : 어느 위치에 있든지 패키지와 상관없이 사용할 수 있는 클래스입니다.

      ▶ print, math, Scanner 등등

 

 

4. 클래스 변수

   ▷ 클래스로부터 객체를 생성하려면 객체 생성 연산자인 new가 필요합니다.

   ▷ new 연산자는 객체를 생성시키고 객체의 주소를 리턴합니다.

 

   ▷ 라이브러리 클래스 : 실행할 수 없으며 다른 클래스에서 이용하는 클래스입니다.

   ▷ 실행 클래스 : main() 메소드를 가지고 있는 실행 가능한 클래스입니다.

 

 

5. 클래스 구성 멤버(생성자, 필드, 메소드)

   ▷ 필드(변수) : 객체의 데이터를 저장하는 역할입니다. 선언 형태는 변수 선언과 비슷하지만 쓰임새는 다릅니다.

   ▷ 생성자 : new 연산자로 객체를 생성할 때 객체의 초기화 역할입니다.

                  선언 형태는 메소드와 비슷하지만, 리턴 타입이 없고 이름은 클래스 이름과 동일합니다.

   ▷ 메소드(함수) : 객체가 수행할 동작입니다. 함수라고도 불립니다.

 

 

 

6. 필드 선언과 사용

   ▷ 필드는 클래스 블록에서 선언되어야 합니다.

   ▷ 타입은 필드에 저장할 데이터의 종류를 결정합니다. 기본 타입, 참조 타입 모두 가능합니다.

   ▷ 초기값을 제공하지 않을 경우 필드는 객체 생성 시 자동으로 기본값으로 초기화합니다.

   ▷ 필드 사용 : 필드 값을 읽고 변경하는 것입니다. 클래스로부터 객체가 생성된 후에 필드를 사용할 수 있습니다.

   ▷ 필드는 객체 내부의 생성자와 메소드 내부에서 사용할 수 있고, 객체 외부에서도 접근해서 사용할 수 있습니다.

 

 

◎ 클래스 사용 예제

public class Car {
	
	//필드 선언
	String model;
	boolean start;
	int speed;
}

 

public class CarExample {
	public static void main(String[] args) {
		// Car 클래스를 이용하여 myCar 객체 생성
		Car myCar = new Car();
		
		System.out.println("모델명 : " + myCar.model);
		System.out.println("시동여부 : " + myCar.start);
		System.out.println("현재속도 : " + myCar.speed);
		
	}
}

// 출력 : 
// 모델명 : null
// 시동여부 : false
// 현재속도 : 0

 

◎ 클래스 사용 예제2

public class Car {
	
	//필드 선언
	String company = "현대자동차";
	String model = "그랜저";
	String color = "검정";
	int maxSpeed = 350;
	int speed;
}

 

public class CarExample {
	public static void main(String[] args) {
		// Car 클래스를 이용하여 myCar 객체 생성
		Car myCar = new Car();
		
		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);
		
		myCar.speed = 60;
		System.out.println("현재속도 : " + myCar.speed);
	}
}

// 출력 : 
// 제조회사 : 현대자동차
// 모델명 : 그랜저
// 색깔 : 검정
// 최고속도 : 350
// 현재속도 : 0

 

위와 같이 클래스를 별도로 만들어야하지만 한 class 폴더 안에 다 저장할 수도 있습니다.

 

 

7. 생성자 선언과 호출

   ▷ 기본 생성자 : 클래스에 생성자 선언이 없으면 컴파일러는 기본 생성자를 바이트코드 파일에 자동으로 추가합니다.

   ▷ 생성자 선언 : 객체를 다양하게 초기화하기 위해 생성자를 직접 선언할 수 있습니다.

   ▷ 생성자는 메소드와 비슷한 모양을 가지고 있으나, 리턴 타입이 없고 클래스 이름과 동일합니다.

   ▷ 매개변수의 타입은 매개 값의 종륭에 맞게 작성합니다.

 

// Car class 초기화
Car(){
}
	
Car(String model, String color, int maxSpeed){
}


이전에 작성했던 클래스에 위 아래와 같은 내용을 넣습니다.

//CarExample class 
		
Car myCar2 = new Car("제네시스", "빨강", 250);

 

   ▷ 필드 초기화 : 객체마다 동일한 값을 가지고 있다면 필드 선언 시 초기값을 대입하는 것이 좋고,

        객체마다 다른 값을 가져야 한다면 생성자에서 필드를 초기화하는 것이 좋습니다.

 

public class Korean {
	
	//필드 선언
	String nation = "대한민국";
	String name = "그랜저";
	String ssn = "검정";
	
	public Korean(String name, String ssn) {
		this.name = name;
		this.ssn = ssn;
	}
}



public class KoreanExample {
	
	public static void main(String[] args) {
		Korean k1 = new Korean("박자바", "011225-1234567");
		
		System.out.println("k1.nation : " + k1.nation);
		System.out.println("k1.name : " + k1.name);
		System.out.println("k1.ssn : " + k1.ssn);
		
		Korean k2 = new Korean("김자바", "930525-0654321");
		System.out.println("k2.nation : " + k2.nation);
		System.out.println("k2.name : " + k2.name);
		System.out.println("k2.ssn : " + k2.ssn);
		}	
	}

// 출력 :
// k1.nation : 대한민국
// k1.name : 박자바
// k1.ssn : 011225-1234567
// k2.nation : 대한민국
// k2.name : 김자바
// k2.ssn : 930525-0654321

 

   ▷ 생성자 오버로딩

      ▶ 매개변수를 달리하는 생성자를 여러 개 선언하는 것

      ▶ 매개변수의 타입, 개수, 선언된 순서가 똑같을 경우 매개변수 이름만 바꾸는 것은 생성자 오버로딩이 아닙니다.

      ▶ 생성자가 오버로딩되어 있을 경우, new 연산자로 생성자를 호출할 때 제공되는 매개값의 타입과 수에 따라 실행될

           생성자가 결정됩니다.

 

public class Car {
	
	//필드 선언
	String company = "현대자동차";
	String model;
	String color;
	int maxSpeed;
	
	Car(){
	}
	
	Car(String model){
		this.model = model;
	}

	Car(String model, String color){
		this.model = model;
		this.color = color;
	}
	
	Car(String model, String color, int maxSpeed){
		this.model = model;
		this.color = color;
		this.maxSpeed = maxSpeed;
	}
}

 

public class CarExample {
	public static void main(String[] args) {
		// Car 클래스를 이용하여 myCar 객체 생성
		Car car1 = new Car();
		System.out.println("car1.company : " + car1.company);
		System.out.println("car1.model : " + car1.model);
		System.out.println();
		
		Car car2 = new Car("자가용");
		System.out.println("car2.company : " + car2.company);
		System.out.println("car2.model : " + car2.model);
		System.out.println();

		Car car3 = new Car("자가용", "빨강");
		System.out.println("car3.company : " + car3.company);
		System.out.println("car3.model : " + car3.model);
		System.out.println("car3.color : " + car3.color);
		System.out.println();
		
		Car car4 = new Car("택시", "빨강", 200);
		System.out.println("car4.company : " + car4.company);
		System.out.println("car4.model : " + car4.model);
		System.out.println("car4.color : " + car4.color);
		System.out.println("car4.maxSpeed : " + car4.maxSpeed);
		System.out.println();
	}
}

// 출력 :
// car1.company : 현대자동차
// car1.model : null
//
// car2.company : 현대자동차
// car2.model : 자가용
//
// car3.company : 현대자동차
// car3.model : 자가용
// car3.color : 빨강
//
// car4.company : 현대자동차
// car4.model : 택시
// car4.color : 빨강
// car4.maxSpeed : 200

 

   ▷ 다른 생성자 호출

      ▶ 생성자 오버로딩이 많아질 경우 생성자 간의 중복된 코드가 발생할 수 있습니다.

      ▶ 이 경우 공통 코드를 한 생성자에만 집중적으로 작성하고, 나머지 생성자는 this(...)를 사용해 공통 생성자 호출

 

public class Car {
	
	//필드 선언
	String company = "현대자동차";
	String model;
	String color;
	int maxSpeed;
	
	Car(String model){
		this(model, "은색", 250);
	}

	Car(String model, String color){
		this(model, color, 250);
	}
	
	Car(String model, String color, int maxSpeed){
		this.model = model;
		this.color = color;
		this.maxSpeed = maxSpeed;
	}
}

// 생성자 선언을 줄이고 싶다면 오버로딩 변수에 맞춰서 this(값1, 값2, 값3)로 사용하면 됩니다.

 

public class CarExample {
	public static void main(String[] args) {
		// Car 클래스를 이용하여 myCar 객체 생성
		Car car1 = new Car("자가용");
		System.out.println("car1.company : " + car1.company);
		System.out.println("car1.model : " + car1.model);
		System.out.println("car1.color : " + car1.color);
		System.out.println("car1.maxSpeed : " + car1.maxSpeed);
		System.out.println();
		
		Car car2 = new Car("자가용", "빨강");
		System.out.println("car2.company : " + car2.company);
		System.out.println("car2.model : " + car2.model);
		System.out.println("car2.color : " + car2.color);
		System.out.println("car2.maxSpeed : " + car2.maxSpeed);
		System.out.println();

		Car car3 = new Car("택시", "빨강", 200);
		System.out.println("car3.company : " + car3.company);
		System.out.println("car3.model : " + car3.model);
		System.out.println("car3.color : " + car3.color);
		System.out.println("car3.maxSpeed : " + car3.maxSpeed);
		System.out.println();
	}
}

//	출력 : 
//	car1.company : 현대자동차
//	car1.model : 자가용
//	car1.color : 은색
//	car1.maxSpeed : 250
//
//	car2.company : 현대자동차
//	car2.model : 자가용
//	car2.color : 빨강
//	car2.maxSpeed : 250
//
//	car3.company : 현대자동차
//	car3.model : 택시
//	car3.color : 빨강
//	car3.maxSpeed : 200

 

클래스에 대해서 알아보았습니다. 메인에 코드를 줄이기 위해서 class를 잘 사용하는 것이 중요할 것같네요!!

 

많은 분들의 피드백은 언제나 환영합니다! 많은 댓글 부탁드려요~~

 

 

728x90
반응형