JAVA/Java 기초

객체, 클래스 변수.java

john_ 2023. 1. 10. 12:50
728x90

객체

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

객체는 속성동작으로 구성됩니다. 이러한 속성과 동작을 필드메소드라고 부릅니다.

 

 


 

객체 지향 프로그래밍(OOP)

객체들을 먼저 만들고, 이 객체들을 하나씩 조립해서 완성된 프로그램을 만드는 기법입니다.

 

객체의 상호작용

  • 객체 지향 프로그램에서도 개게들은 다른 객체와 서로 상호작용 하면서 동작합니다.
  • 객체가 다른 객체의 기능을 이용할 때 이 메소드를 호출해 데이터를 주고받습니다.

  • 매개값 : 객체가 전달하고자 하는 데이터이며, 메소드 이름과 함께 괄호()안에 기술합니다.
  • 리턴값 : 메소드의 실행의 결과이며, 호출한 곳으로 돌려주는 값입니다.
메소드(매개값1, 매개값2, ...);

 


객체 간의 관계

  • 집합 관계 : 완성품과 부품의 관계
  • 사용 관계 : 다른 객체의 필드를 읽고 변경하거나 메소드를 호출하는 관계
  • 상속 관계 : 부모와 자식 관계. 필드, 메소드를 물려받습니다.

 


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

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

상속 : 부모 객체가 자기 필드와 메소드를 자식객체에게 물려주어 자식 객체가 사용할수 있는 것입니다.

-> 코드 재사용성을 높이고 유지보수 시간을 최소화 시킬수 있습니다.

 

 

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

 


클래스와 인스턴스

  • 객체 지향 프로그래밍에서도 객체를 생성하려면 설계도에 해당하는 클래스가 필요합니다.
  • 클래스로부터 생성된 객체를 해당 클래스의 인스턴스라고 부릅니다.
  • 클래스로부터 객체를 만드는 과정을 인스턴스화 라고 합니다.
  • 동일한 클래스로부터 여러 개의 인스턴스를 만들 수 있습니다.

같은 클래스에서 파생되어도 인스턴스화 된 객체는 서로다른 객체입니다.

 


클래스 선언

  • 객체를 생성하고, 객체가 가져야할 데이터(필드)가 무엇이고, 객체의 동작(메소드)은 무엇인지를 정의합니다.
  • 클래스 선언은 소스 파일명과 동일하게 작성합니다.

  • 클래스 명은 첫문자를 대문자로 하고 캐멀 스타일로 작성합니다. 숫자를 포함해도 되지만 첫 문자는 숫자가 될수 없고 특수 문자중 $, _를 포함할수있습니다.
  • 공개 클래스 : 어느 위치에 있든지 패키지와 상관없이 사용할수 있는 클래스입니다.
    •  print, printf, println, int, double... 

클래스 변수

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

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

클래스 변수 = new 클래스();

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

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

 


생성자, 필드, 메소드

  • 필드 : 객체의 데이터를 저장하는 역할. 선언현태는 변수선언과 비슷하지만 쓰임새가 다릅니다.
  • 생성자 : new연산자로 객체를 생성할 때 객체의 초기화 역할. 선언 형태는 메소드와 비슷하지만,  리턴타입ㅇ ㅣ없고 이름은 클래스 이름과 동일합니다.
  • 메소드 : 객체가 수행할 동작. 함수로도 불립니다.

 


public class Car {
	
	//필드(객체에 대한 변수 == 속성)
	boolean powerOn;
	String color;
	int wheel;
	int speed;
	boolean wiperOn;
	
	// 메소드 (함수 == function == 기능)  변수명() <- 다 메소드입니다!
	
	void power() {
		powerOn = !powerOn;
	}
	void speedUp() {
		speed++;
	}
	void speedDown() {
		speed--;
	}
	void wiper() {
		wiperOn = !wiperOn;
	}
}

 


필드 선언

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

타입 필드명[ = 초기값];

 

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

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

Car.java 파일
public class Car {
	// 필드선언
	String model;
	boolean start;
	int speed;
}
CarExample.java 파일
public class CarExample {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		// Car 클래스를 이용하여 Car 객체 생성
		Car myCar = new Car();
		
		System.out.println("모델명 : " + myCar.model);
		System.out.println("시동여부 : " + myCar.start);
		System.out.println("현재속도 : " + myCar.speed);
	}
}
결과 : 
모델명 : null
시동여부 : false
현재속도 : 0
// 자동으로 초기화 된 값들

 


 

필드 사용

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

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

 

 

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

	public static void main(String[] args) {
		
		// Car 클래스를 이용하여 Car 객체 생성
		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 객체의 필드값 변경
		myCar.speed = 60;
		System.out.println("현재속도 : " + myCar.speed);
	}
}
결과 : 
제조회사 : 현대자동차
모델명 : 그랜저
색상명 : 검정
최고속도 : 350
현재속도 : 0
현재속도 : 60

 


기본 생성자

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

[public] 클래스() { }

생성자 선언

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

  • 생성자는 메소드와 비슷한 모양을 갖고 있으나, 리턴 타입이 없고 클래스 이름과 동일합니다.
  • 매개변수의 타입은 매개값의 종류에 맞게 작성합니다.
클래스는 인스턴스를 통해 객체화가 되지않으면 사용할수없습니다.
//car1 이라는 클래스가 존재할때
System.out.pritnln("시동 처음 초기화 : " + car1.powerOn); // 사용불가

car1 mycar = new car1();
System.out.pritnln("시동 처음 초기화 : " + mycar.powerOn); // 사용가능

필드 초기화

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

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


생성자 오버로딩

매개변수를 달리 하는 생성자를 여러개 선언하는것입니다.
Car.java
public class Car {
	// 필드선언
	String company = "현대자동차";
	String model;
	String color;
	int maxSpeed;
	int speed;
	
	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;
	}
}
CarExample.java
public class CarExample {

	public static void main(String[] args) {
		
		// Car 클래스를 이용하여 Car 객체 생성
		Car car1 = new Car();
		System.out.println("car1.company : " + car1.company);
		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);
	}
}
결과 :
car1.company : 현대자동차

car2.company : 현대자동차
car2.model : 자가용

car3.company : 현대자동차
car3.model : 자가용
car3.color : 빨강

car4.company : 현대자동차
car4.model : 자가용
car4.color : 빨강
car4.maxSpeed : 200
  • 매개변수의 타입, 개수, 선언된 순서가 똑같을 경우 매개변수의 이름만 바꾸는것은 생성자 오버로딩이 아닙니다.
  • 생성자가 오버로딩 되어 있을 경우, new 연산자로 생성자를 호출할 때 재공되는 매개값의 타입과 수에 따라 실행될 생성자가 결정됩니다.

다른 생성자 호출

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

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

 

 

 

public class Car {
	// 필드선언
	String company = "현대자동차";
	String model;
	String color;
	int maxSpeed;
	int speed;
	
	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;
//		
	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;
	}
	// 위처럼 사용도 가능합니다.
}

 


메소드 선언

객체의 동작을 실행 블록으로 정의하는 것입니다.

  • 리턴 타입 : 메소드 실행 후 호출한 곳으로 전달하는 결과값의 타입입니다.
  • 메소드 명 : 메소드 명은 첫 문자를 소문자로 시작하고, 캐멀 스타일로 작성 합니다.
  • 매개 변수 : 메소드를 호출 할때 전달한 매개값을 받기 위해 사용합니다.
  • 실행 블록 : 메소드 호출시 실행되는 부분 입니다.
Calculator.java
public class Calculator {

	// 리턴 값이 없는 메소드 선언
	void powerOn() {
		System.out.println("전원을 켭니다.");
	}
	
	// 리턴 값이 없는 메소드 선언
	 void powerOff() {
		 System.out.println("전원을 끕니다.");
	 }
	 
	 // 호출 시 두 정수 값을 전달 받고,
	 // 호출한 곳으로 결과 값을 int 형으로 리턴하는 메소드
	 int plus(int x, int y) {
		 int result = x + y;
		 return result;
	 }
	 
	 // 호출 시 두 정수 값을 전달받고,
	 // 호출한 곳으로 결과값 double형으로 리턴 하는 메소드
	 double divide(int x, int y) {
		 double result = (double)x / (double)y;
		 return result;	// 리턴값
	 }
}
public class CalculatorExam {

	public static void main(String[] args) {

		Calculator myCalc = new Calculator();
		
		//리턴 없는 메소드는 저장할 변수가 필요없습니다.
		myCalc.powerOn();
		
		//리턴 되는 메소드는 리턴되는 값을 저장할 변수(리턴되는 타입과 동일한 타입)가 필요합니다.
		int result1 = myCalc.plus(5, 6);
		System.out.println("result1 : " + result1);
		
		int x= 10;
		int y= 4;
		double result2 = myCalc.divide(x,y);
		System.out.println("result2: " + result2);
		
		myCalc.powerOff();
	}
}

메소드 호출

  • 메소드 블록을 실제로 실행합니다.
  • 클래스로부터 객체가 생성된 후에 메소드는 생성자와 다른 메소드 내부에서 호출될 수 있고, 객체 외부에서도 호출 될 수 있습니다.
  • 외부 객체에서는 참조 변수와 도트(.) 연산자로 호출합니다.

 

 

 


가변길이 매개변수

  • 메소드가 가변길이 매개변수를 가지고 있다면 매개변수의 개수와 상관없이 매개값을 줄수있습니다.
int sum(int ... values) {
}
  • 메소드 호출시 매개값을 쉼표로 구분해서 개수와 상관없이 제공할수 있습니다.
  • 매개값들은 자동으로 배열 항목으로 변환되어 메소드에서 사용됩니다.
public class computer {
	
	int sum(int ... values) {
		int sum = 0;
		
		for(int i=0; i<values.length; i++) {
			sum += values[i];
		}
		return sum;
	}
}
public class ComputerExam {

	public static void main(String[] args) {

		computer myCom = new computer();
		
		int result1 = myCom.sum(1,2,3);	//매개변수 3개
		System.out.println("result1: " + result1);

		int result2 = myCom.sum(1,2,3,4,5);	//매개변수 5개
		System.out.println("result2: " + result2);
		
		int[] values = {1,2,3,4,5};
		int result3 = myCom.sum(values);	//매개변수 : 배열형태로 입력
		System.out.println("resutl3: " + result3);
		
		int result4 = myCom.sum(new int[] {1,2,3,4,5});	//매개변수 : new 배열로 선언해서 입력
		System.out.println("result4: " + result4);
	}
}
결과 : 
result1: 6
result2: 15
resutl3: 15
result4: 15

 


return문

메소드의 실행을 강제 종료하고 호출한 곳으로 돌아간다는 의미입니다.

메소드 선언에 리턴 타입이 있을 경우에는 return 문 뒤에 리턴값을 추가로 지정해야 합니다.

return [리턴값];

return문 이후에 실행문을 작성하면 'Unreachable code' 라는 컴파일 에러가 발생합니다.

 

Car.java
public class Car {
	int gas;
	
	void setGas(int gas) {
		this.gas = gas;
	}
	
	boolean isLeftGas() {
		if (gas == 0) {
			System.out.println("gas가 없습니다.");
			return false;
		}
		System.out.println("gas가 있습니다.");
		return true;
	}
	void run() {
		while(true) {
			if (gas>0) {
				System.out.println("달립니다. (gas 잔량 : " + gas + ")");
				gas --;
			}else {
				System.out.println("멈춥니다. (gas 잔량 : " + gas + ")");
				return;	//지금 현재 동작하는 run() 메소드를 종료합니다.
			}
		}
	}
}
실행코드 
public class CarExample {

	public static void main(String[] args) {
		
		Car myCar = new Car();
		
		myCar.setGas(5);
		
		if(myCar.isLeftGas()) {
			System.out.println("출발합니다.");
			myCar.run();
		}
		System.out.println("Required more Vespin Gas.");
	}
}

 


메소드 오버로딩

메소드 이름은 같되, 매

개변수의 타입, 개수, 순서가 다른 메소드를 여러개 선언 하는것입니다.

 

다양한 매개값을 처리하기 위해서 사용합니다.

 

예를들어 다음과 같이 사용이 가능합니다.

int plus(int x, int y) {
	int result = x + y;
	return result;
}

double plus(double x, double y) {
	double result = x + y;
	return result;
}

예제를 한번 들어보겠습니다.

주어진 값을 이용해 정사각형의 넓이와 직사각형의 넓이를 구하는 코드를 작성하세요.
오버로딩을 사용하세요.
Calcul.java
public class Calcul {

	//정사각형의 넓이
	double areaRectangle(double width) {
		return width * width;
		//넓이 * 넓이
	}
	
	//직사각형의 넓이
	double areaRectangle(double width, double height) {
		return width * height;
	}
}
실행코드
public class CalculatorExam {

	public static void main(String[] args) {

		//객체 생성
		Calcul myCalcu = new Calcul();
		
		//정사각형의 넓이 구하기
		double result1 = myCalcu.areaRectangle(120);
		
		//직사각형의 넓이 구하기
		double result2 = myCalcu.areaRectangle(20, 300);
		
		System.out.println("정사각형의 넓이 = " + result1);
		System.out.println("직사각형의 넓이 = " + result2);
	}
}
결과 : 
정사각형의 넓이 = 14400.0
직사각형의 넓이 = 6000.0
728x90

'JAVA > Java 기초' 카테고리의 다른 글

패키지.java  (0) 2023.01.11
인스턴스 멤버, static, final ...  (0) 2023.01.11
참조-배열 등등...java  (0) 2023.01.10
배열 응용문제  (0) 2023.01.09
참조 타입.java  (0) 2023.01.09