printf("%c의 블로그", 'Molkka');

코딩공부/JAVA

[java] 클래스 ( class )

mol_kka 2022. 1. 5. 18:12

 

클래스란?

> 여러가지 타입들을 몰아서 쓰고 싶을 때 사용하는 변수의 묶음이자, 그 변수의 값을 바꾸고 싶을 때 할 수 있는 행동들을 정의해 놓은 파일.

> 접근제어자 사용 가능. (public, private..) : 외부의 접근을 제어함

> return 1; : 함수가 실행되고 값으로 귀결될 시 void를 리턴값의 자료형으로 바꿔줘야 함. 리턴값 없으면 void

> oop(object oriented programming) = 객체 지향 프로그래밍, 상속과 캡슐화, 다형성 등의 특징 가짐

> 클래스 만들 때, 생성자 메소드 필수!

 

 

 

1. 클래스 생성

public class Circle {

	int radius; // 속성, properties, field, member field
	String name; 

	// 생성자 함수
	public Circle() {
		System.out.println("원이 생겼습니다.");
	}
	// 클래스가 가지고 있는 함수
	public double getArea() {
		return radius * radius * 3.14;
	}

 

 

 

2. 클래스 생성자

public class Circle02 {
	int radius;
	String name;
    
	public Circle02() {
		radius = 1;
	}

	public Circle02(int radius) {
		this.radius = radius;
	}

	public Circle02(int radius, String n) {
		this.radius = radius;
		name = n;
	}
}

// constructor === 생성자
// 생성자는 리턴 타입 없음
// 생성자 함수 = 매소드와 이름이 같아야 함
// 여러개 작성 가능(오버로딩)
// new를 통해 객체가 선언될 때 한 번 호출
// 초기화, 초기화 필요 없는 객체는 컴파일러가 자동으로 하나 만들어서 집어 넣음(default 생성자)
// this. 를 사용해 생성된 객체 지정

 

 

 

3. 객체 생성하기

* Circle, Circle02 클래스 파일이 들어있는 패키지 안에 CircleTest 클래스 파일 생성

public class CircleTest {

	static void increase(Circle circle) {
		circle.radius++;
	}
	
	public static void main(String[] args) {

		Circle pizza = new Circle(); // 객체 생성==메모리(heap메모리)에 올라감
		pizza.name = "새우피자";
		pizza.radius = 20;
		double area = pizza.getArea();
		System.out.println("피자 이름은" + pizza.name + "이고 반지름은 " + pizza.radius + "이고 면적은" + area + "이다.");

		increase(pizza); // ->increase 함수에 static 안 쓰면 오류남

		System.out.println(pizza.radius); // 21

		Circle donut = new Circle(); // 객체 생성==메모리(heap메모리)에 올라감
		donut.name = "던킨";
		donut.radius = 10;
		double area02 = donut.getArea();
		System.out.println("도넛 이름은" + donut.name + "이고 반지름은 " + donut.radius + "이고 면적은" + area02 + "이다.");

//		생성자 함수가 여려개인 Circle 객체 생성
		Circle02 circle02 = new Circle02();
		double area03 = circle02.getArea();
		System.out.println(area03);

		Circle02 circle03 = new Circle02(50, "바퀴");
		double area04 = circle03.getArea();
		System.out.println(area04 + "===" + circle03.name);

//		변수와 달리 객체는 값을 할당하는 게 아니라 주소를 공유하는거라 다른데서 값을 바꾸면 해당 값을 주소로 가리키는 객체 모두가 바뀜
		Circle won;
		won = pizza;
		won.name = "동그라미";
		System.out.println(won.name + "===" + pizza.name); //새우피자 -> 동그라미, 둘 다 동그라미

		int num = 3;
		int copyNum = num;
		copyNum = 4;
		System.out.println(num + "===" + copyNum); // 3 === 4

		Circle02 circleArr[] = new Circle02[5]; // 객체 배열 선언 가능
		int intArr[] = new int[5];

		for (int i = 0; i < circleArr.length; i++) {
			circleArr[i] = new Circle02(i + 1, "c" + (i + 1));
			System.out.println(circleArr[i].name + " " + circleArr[i].radius + " " + circleArr[i].getArea());
		}
	}

}

// 객체를 할당하면 레퍼런스 참조, 기본타입의 변수는 복사됨
// 서로 다른 클래스 파일의 클래스들은 같은 패키지 안에 있으면 사용 가능
// static, heap, stack : static은 stack에서 값을 가져다 쓸 수 없음

 

 

 

4. scanner로 객체 속성 입력받기

package lecture;

public class Rectangle {
	int width;
	int height;

	public Rectangle() { // 생성자 함수
		System.out.println("사각형이 만들어 졌습니다.");
	}

	public int getArea() { // 메소드
		return width * height;
	}
}
package lecture;

import java.util.Scanner;

public class RectangleTest {

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		Rectangle rect = new Rectangle();
		rect.width = scan.nextInt();
		rect.height = scan.nextInt();
		int area = rect.getArea();
		System.out.println(area);
		scan.close();
	}

}