[Java] 클래스를 사용하게 된 이유, 클래스 구성요소의 설명과 특징, 사용방법

    [클래스 도입 이유]

    학생1, 2의 데이터를 저장하고 그 데이터를 출력하는 프로그램을 만든다고 생각해보자

     

    첫째로 그냥 변수에 학생 한명에 대한 데이터를 일일히 추가해서 출력하는 방법이 있다.

    이 방법의 단점은 학생 한명을 추가할때마다 변수를 또 만들고 출력문도 생성해줘야 하는 번거로움이 있다.

    public class ClassStart1 {
        public static void main(String[] args) {
            String student1Name = "학생1";
            int student1Age = 15;
            int student1Grade = 90;
    
            String student2Name = "학생2";
            int student2Age = 16;
            int student2Grade = 80;
    
            System.out.println("이름:" + student1Name + " 나이:" + student1Age + " 성적:" + student1Grade);
            System.out.println("이름:" + student2Name + " 나이:" + student2Age + " 성적:" + student2Grade);
        }
    }

     

     

    두번째로 배열을 이용해서 학생을 추가할때마다 변수 생성을 안하고 출력문도 생성안하게 하는 방법이다.

    배열을 사용해서 학생 추가를 하려면 배열에 값만 추가해주면 되는 장점이 있지만 반대로 학생의 데이터를 변경할때 매우 조심해야 한다. 정확한 인덱스의 데이터를 수정해야 하는데 사용자가 실수할 수 있다.

    public class ClassStart2 {
        public static void main(String[] args) {
            String[] studentNames = {"학생1", "학생2"};
            int[] studentAges = {15, 16};
            int[] studentGrades = {90, 80};
    
            for (int i = 0; i < studentNames.length; i++) {
                System.out.println("이름:" + studentNames[i] + " 나이:" + studentAges[i]
                	+ " 성적:" + studentGrades[i]);
            }
        }
    }

     

     

    위 단점을 해결하기 위해서는 학생1, 2에 대한 데이터를 하나로 묶어서 관리해야 한다. 그래서 학생이라는 개념을 만들고 사용할 수 있게 클래스가 도입된 것이다.

     

    [클래스 구성요소와 설명]

    현실 세계에서 어떤 제품을 만들 때 부품을 먼저 개발하고 이 부품들을 하나씩 조립해서 완성하듯이 소프트웨어를 개발할 때에도 부품에 해당하는 객체를 만든다.  객체를 하나씩 조립해서 완성된 프로그램을 만드는 기법을 객체 지향 프로그래밍이라고 한다.

    객체란 물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신의 속성을 가지고 있으면서 식별 가능한 것을 말한다. 현실 세계의 객체를 소프트웨어 객체로 설계하는 것을 객체 모델링 이라고 한다.

    설계도가 바로 클래스이며, 자바에서 사용자가 직접 만드는 데이터 타입이다.

    그 설계도인 클래스를 사용해서 실제 메모리에 만들어진 실체를 객체 또는 인스턴스라고 한다.

    [클래스 3가지 구성요소]

    클래스는 필드, 생성자, 메서드 3가지로 구성된다.

    package study.클래스;
    
    public class Student {
        //필드
        String name;
        int age;
        int grade;
    
        //기본 생성자
        Student() {}
    
        //사용자 지정 생성자
        Student(String name, int age, int grade) {
            this.name = name;
            this.age = age;
            this.grade = grade;
        }
    
        ////메소드
        public void info() {
            System.out.println("이름:" + name + " 나이:" + age + " 성적:" + grade);
        }
    }

     

    1. 필드

    필드는 객체의 상태 정보 데이터가 저장되는 곳이다. 해당 클래스안에 어떤 필드를 만들것이냐가 설계의 가장 중요한 요소이다. 필드는 변수처럼 선언 되지만 변수는 생성자와 메서드 내에서 선언되는 것이고 생성자 메서드 실행이 끝나면 소멸된다.

    필드와 변수의 생성 방식이 같지만 필드는 클래스 내에 생성, 변수는 생성자나 메서드 내에서 생성되는 것이기 때문에 필드를 멤버 변수라고도 부른다. 필드를 선언하고 초기값을 주지 않으면 자동으로  데이터 타입에 맞는 기본 초기값으로 설정된다. (숫자타입은 0, 논리타입은 false, 참조타입은 null)

    필드에는 기본 데이터 타입에만 들어갈 수 있는것이 아니라 참조타입인 객체, 배열, 리스트도 들어갈 수 있다.

     

    2. 생성자

    생성자는 new 연산자로 호출되는 특별한 중괄호 {} 블럭이다. 생성자의 역할은 객체 생성시 초기화를 담당하는데 리턴 타입이 없다. 생성자는 클래스내에 따로 생성하지 않아도 컴파일러에 의해 기본 생성자가 생성된다. 그러나 명시적으로 생성한 생성자가 있으면 생성하지 않는다. 그래서 아래처럼 사용자 지정 생성자가 있을땐 기본생성자를 명시적으로 생성해야 한다.

    public class Student {
        //기본 생성자
        Student() {}
    
        //사용자 지정 생성자
        Student(String name, int age, int grade) {
            this.name = name;
            this.age = age;
            this.grade = grade;
        }
    }

     

    생성자를 통해서 필드를 초기화 하고 싶을때 변수명이 같으면 앞에 멤버 변수명 앞에 this. 를 붙여줘야 한다. 파라미터로 받은 로컬 변수명과 필드명이 같은 변수명일 때 로컬 변수가 더 우선순위 가 높기 때문이고, this.는 객체 자신의 참조이기 때문이다. 

    3. 메소드

    객체의 동작에 해당하는 중괄호 {} 블럭이다. 메서드는 생성자와 다르게 접근제한자와 리턴타입을 가지고 있다.

    클래스 내부에서 메소드를 호출할 때는 메소드 이름으로 호출하면 되지만 클래스 외부에서 호출할때는 클래스로부터 객체를 생성한 후 참조 변수를 이용해서 메소드를 호출해야 한다. 

     

     

    [클래스 사용]

    public class ClassStart3 {
        public static void main(String[] args) {
            Student student1;
            student1 = new Student();
            student1.name = "학생1";
            student1.age = 15;
            student1.grade = 90;
            student1.info();
    
            Student student2 = new Student();
            student2.name = "학생2";
            student2.age = 16;
            student2.grade = 80;
            student2.info();
        }
    }

     

    - Student student1는 Student의 타입을 받을수 있는 student1이라는 이름의 변수를 선언한다. 스택영역에 배치된다.

    -  new Student()는 힙 영역에 생성된 객체의 주소를 반환한다. 그 주소를 student1 에 저장하는 것이다.

     

    클래스를 사용해서 배열로 관리했던 학생들을 클래스로 관리하게 되면서 학생을 추가하거나 삭제 출력이 간편해진다. 삭제를 하려면 student2 에 null을 넣으면 힙 영역에 생성된 객체를 참조하지 않기 때문에 가비지컬렉션에 의해 삭제된다.

     

     

    참고 : https://www.inflearn.com/course/%EA%B9%80%EC%98%81%ED%95%9C%EC%9D%98-%EC%8B%A4%EC%A0%84-%EC%9E%90%EB%B0%94-%EA%B8%B0%EB%B3%B8%ED%8E%B8

    참고 : 혼자 공부하는 자바 / 신용권  https://www.yes24.com/Product/Goods/74269939 

     

    댓글

    Designed by JB FACTORY