코딩공부/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();
}
}