JAVA Day-12

클래스

메소드에 대해 알아보았으니 클래스에 대해 알아보도록 하자
클래스를 사용하게 되면 기능의 집합체를 사용하고 이 기능을 원할때 불러와서 사용 할 수 있다는 장점이 있다. 원할때 사용하는 기능이라니 '얼마나 멋진 일인가?!'

클래스는 마치 실체가 없는 것을 실체화시켜서 사용한다. 이 것을 인스턴스화라고 하는데 마치 아이디어로만 존재하는 생각들을 공책을 피고 실체화하는 것과 같은 것이다. 이 클래스란 무엇인지 그리고 어떻게 사용하는지 알아보도록 하자.

클래스란 무엇인가?

클래스의 정의

클래스의 정의는 두가지로 정의된다. 타입과 주어이다.
1) 클래스는 타입이다.
클래스를 정의할 때 그 안에 메소드와 필드도 정의한다. 그 안에 공통요소로 정의되는 필드들로 인하여 공통요소의 타입이라고 한다.
2) 클래스는 주어이다.
나는 여기에 극히 공감한다.
클래스명.메소드명() 처럼 사용 되는데 주어처럼 앞에 나와 사용되고 또한 개발자끼리의 약속도 클래스명의 앞글자는 주어처럼 대문자로 사용된다.

절차지향과 객체지향의 차이

클래스를 사용하기 위해서는 절차지향과 객체지향의 차이를 알아야된다. 클래스는 객체지향으로 사용된다라고 하는데 용어를 모르면 이해가 되지 않기 때문이다.
1) 절차지향
빵을 만들고 판매를 할때 생각해보자 반죽을 하고 발효를 하고 굽고 장식하고 판매를 한다. 하지만 중간의 과정이 없다면 이후 과정을 진행할 수 없다. 아래의 그림을 참고해보자

절차를 진행하여 전 단계를 진행하니 않으면 더 이상 진행되지 않는다.
이는 C언어와 알고리즘에 특화되어있다.

2) 객체지향
객체지향은 마치 빵을 만들 때 중간 과정을 직원에게 시키는 것과 같다.
내가 하지 않아도 직원이 과정을 수행하면 수행한 과정을 가져와 다음을 진행할 수 있기 때문이다. 이 가져오는 과정을 객체화, 인스턴스화라고 한다.

클래스의 선언

클래스를 선언하는 것은 간단하다. 우리가 eclipse를 통해 클래스를 생성하는 것도 클래스를 선언하는 방법이다. 보통은 클래스를 생성하고 실행하는데 다른 클래스를 생성하고 싶으면 생성된 클래스 바디 밖에서 다시 선언하면 된다.

class 클래스명{
	필드(변수, 메소드);
 }

위와 같이 선언하면 되고 같은 패키지 안에서는 클래스를 원하는 만큼 생성할 수 있다.

클래스 사용

클래스를 사용하는 것은 사용하고자 하는 클래스를 다시 초기화해줘야 사용 가능하다.

클래스명 객체명 = new 클래스명();

이렇게 초기화 해주면 ram의 heap영역안에 생성되어 다시 new를 만나기 전까지 저장되어 있다.

사용을 할때는
객체명.필드(메소드)();

객체화 시키면 저장공간이 만들어지고 그 안에는 주소값이 들어가고 주소값은 heap메모리 영역에 들어가 필드(변수,메서드)에 접근할 수 있도록 돕는다.

이렇게 객체화 해서 사용하는 것을 인스턴스화라고 한다.

인스턴스화란
추상적인 개념을 실체화 시킨다
클래스로 직접 접근하지 않고 클래스타입의 객체를 만들어서 그 객체로 접근한다.

생성자

생성자란 클래스를 만들고 클래스를 사용할때 매개변수와 그 안에 필드를 초기화하는 것을 말한다.
클래스를 생성하면 자동적으로 기본생성자가 생성되고
(클래스면(){} → 이게 기본 생성자임.)
그리고 각 객체들을 매개변수로 받아 초기화하면 생성자를 생성한 것이다.
(Car클래스를 만들면서 알아보자)

Car 클래스 만들어 보자

package day12;

public class Car {
   int price; //객체
   String color; //객체
   String brand;
   String owner;
   
   //기본 생성자
   Car(){}
   
   public Car(int price, String color, String brand, String owner) {
	this.price = price;
	this.color = color;
	this.brand = brand;
	this.owner = owner;
}

   
   void showInfo(){
	   System.out.println(owner+"의 주소값 : "+this);
	   System.out.println(owner+"의 자동차\n"+"브랜드 : " + brand +"\n색상 : " + color +"\n가격 : " +price + "만원");
   }
   
   public static void main(String[] args) {
	   //객체 == 인스턴스 변수
	Car momCar  = new Car(9000, "white", "Benz", "엄마" ); //객체화
	Car dadyCar = new Car();
	Car myCar = new Car();

	momCar.showInfo();	
}
}

Car클래스 설명

1) 먼저 생성된 클래스 안에서 변수를 초기화 하였다.(전역변수)
2) 기본생성자를 만들어 다른이름의 객체를 사용할 수 있도록 하였다.
3) 클래스의 생성자를 만들어 메인메소드에서 초기화 할때 생성자의 매개변수들을 입력 받을 수 있도록 만들었다.
4) showInfo메소드를 만들어 클래스를 초기화하여 사용 할 수 있도록 하였다.
5) 메인메소드를 만들고 그 안에 momCar를 객체화하고 그 안에 생성자의 매개변수를 넣어 초기화하였다.
dadyCar와 myCar에 매개변수를 넣지 않아도 되는 이유는 위에서 기본생성자가 선언되었기 때문이다.
6) 클래스를 사용하기위해 객체명.메소드();를 작성하였다.

오버로딩(overLoading)

오버로딩이란 클래스 안에서 메소드를 선언할때 같은 이름의 메소드일지라도 매개변수의 차이를 이용하여 같은 이름의 메소드를 선언 할 수 있도록 하는 것을 말한다.

public class Caculation{
	void add(int num1, int num2){
    
		System.out.println("두 정수의 합");
		System.out.println(num1+num2);
	}
	
	void add(int num1, int num2, int num3) {
		System.out.println("세 정수의 곱과 더하기");
		System.out.println(num1*num2+num3);
	}
	
	void add(double num1, double num2) {
		System.out.println("두 실수의 합");
		System.out.println(num1+num2);
	}
	
	public static void main(String[] args) {
		OverLoading o = new OverLoading();
		o.add(0.4, 1);
		o.add(2, 3, 4);
		o.add(1, 2);
	}
}

add라는 같은 메소드 이름을 매개변수를 달리하여 선언하니 오류가 생기지 않았다. 입력 받은 매개변수에 따라 다른 메소드가 실행된다.

좋은 웹페이지 즐겨찾기