본문 바로가기
Lang/Java

[Java] class 클래스

by 상똥 2023. 4. 3.

[1. Class]

1. class의 정의 : 객체를 정의하기 위한 설계도 또는 틀

  - 틀이 한 번 설정되면 여러개의 객체에 대한 속성과 기능을 쉽게 정의할 수 있음

2. 클래스의 장점 

  - 코드의 재사용성이 높음

  - 코드의 관리가 용이

3. 클래스의 기능

(1) 속성 정의 : 클래스(Ex.학생명단 )별로 생성되는 인스턴스(Ex.학생)의 속성을 쉽게 정의할 수 있다.

Class Student student1 student2 student3
String name;
String major;
int studentNum;
char grade;
boolean attendence;
Student s1 = new Student();
s1.name = 상희;
s1.major = 경제금융학부;
s1.studentNum = 1001;
s1.grade = 'A'
s1.attendence = true;
Student s1 = new Student();
s1.name = 준희;
s1.major = 로봇공학;
s1.studentNum = 1002;
s1.attendence = false;
Student s1 = new Student();
s1.name = 혜인;
s1.major = 경영학부;
s1.studentNum = 1003;
s3.grade = 'C'

  - 위와 같이 클래스에 지정된 속성 종류를 인스턴스별로 할당 가능

  - 굳이 모든 속성값을 채워야 하는건 아님

(2) 기능 정의 : 각 인스턴스의 속성에 영향을 줄 수 있는 기능을 정의할 수 있다.

Class Student student1 student2 student3
void gradeUp() {++grade;}
void gradeDown() {--grade;}
s1.gradeDown();   s3.gradeUp();
Class Student student1 student2 student3
void attend() {attendence =
                      !attendence}
s1.attendence(); s1.attendence();  
class Student {
    // 학생 클래스의 속성
    String name;
    String major;
    int studentNum;
    char grade;
    boolean attendence;

    // 학생 클래스의 기능 (메서드)
    void gradeUp() {++grade;}
    void gradeDown() {--grade;}
    voide attend() {attendence = !attendence;}
}

public class _01_Class {
    public static void main(String[] args) {
        Student s1 = new Student();
        s1.name = "상희";
        s1.major = "경제금융학부";
        s1.studentNum = 1001;
        s1.grade = 'A';
        s1.attendence = true;

        Student s2 = new Student();
        s2.name = "준희";
        s2.major = "로봇공학";
        s2.studentNum = 1002;
        s1.attendence = false;
        
        Student s3 = new Student();
        s3.name = "혜인";
        s3.major = "경영학부";
        s3.studentNum = 1003;
        s3.grade = 'C';

        s1.gradeDown();
        s3.gradeUp();
        s1.attend();
        s2.attend();
    }
}

 

[2. class의 관리]

1. 참조변수와 주소

  - class(Student)별로 인스턴스를 선언하면 각 참조변수(s1, s2, s3)는 인스턴스의 값이 저장된 주소를 갖게 된다.

  - 하나의 인스턴스 주소를 여러 참조변수가 사용하는 것은 가능하지만 (Ex. s1 = s2; 와 같은 프로그래밍은 가능)

  - 하나의 참조변수가 여러 개의 인스턴스를 갖는 것은 불가능하다.

 

2. 객체 배열

  - class별로 여러 개의 객체가 있다면 배열로 관리하는 것이 편리하다.

  - s1, s2, s3으로 선언하는 것이 아니라 아래와 같이 생성하면 배열처럼 관리하는 것이 가능하다.

Student[] sArr = new Student[3];
sArr[0] = new Student();
sArr[1] = new Student();
sArr[2] = new Student();

//생성할 인스턴스의 수가 많다면 반복문으로도 가능
/*
for (int i = 0; i < sArr.length; i++)
	sArr[i] = new Student();
*/

 

[3. class 변수]

1. 인스턴스 변수

  - 클래스 영역에 선언되는 인스턴스마다 값을 갖는 변수

2. 클래스 변수 

  - 모든 인스턴스가 갖게 되는 공통된 값

  - 선언할 때 static을 앞에 붙여주면 된다

  - 인스턴스가 생성되지 않았더라도 사용할 수 있다

3. 지역 변수 

  - 메서드 내에서만 사용한 변수

  - 메서드의 작업이 끝나면 더는 사용할 수 없다

class Variables {
    int i;            // 인스턴스 변수
    static int j;    // 클래스 변수 (static 변수, 공유 변수)

    void method() {
        int k;        // 지역 변수
    }
}

 

[4. 재귀호출 Recursive call]

팩토리얼 구현

class Factorial {
    public static void main(String[] args) {
        int result = factorial(4);
        System.out.println(result);
    }

    static int factorial(int n) {
        int result = 0;
        if (n == 1)
            result = 1;
        else
            result = n * factorial(n - 1);
        return result;
    }
}
비객체지향적 코드 객체지향적 코드
int hour1, hour2, hour3;
int minute1, minute2, minute3;
float sec1, sec2, sec3;
Time t1 = new Time[];
Time t2 = new Time[];
Time t3 = new Time[];
int[] hour = new int[3];
int[] minute = new int[3];
float sec = new float[3];
Time[] t = new Time[3];
t[0] = new Time();
t[1] = new Time();
t[2] = new Time();

 

 

'Lang > Java' 카테고리의 다른 글

[java] 예외처리  (0) 2023.06.04
[java] 추상화와 인터페이스  (0) 2023.06.04
[java] 객체 지향 프로그래밍  (0) 2023.06.04
[Java] 2차원 리스트 List  (0) 2023.04.06
[Java] 1차원 리스트 List  (0) 2023.04.06