자바 클래스와 객체 1

신범철·2021년 12월 24일
0

자바

목록 보기
1/17

머리말

이글은 자바를 빠르게 끝내기 위해 내가 헷갈리는 부분만을 정리해논 글입니다. Do it! 자바 프로그래밍 입문을 정리하지만 내용을 많이 건너뜀

클래스와 객체

용어설명
객체객체 지향 프로그램의 대상, 생성된 인스턴스
클래스객체를 프로그래밍하기 위해 코드로 만든 상태
인스턴스클래스가 메모리에 생성된 상태
멤버 변수클래스의 속성, 특성
메서드멤버 변수를 이용하여 클래스의 기능을 구현
참조 변수메모리에 생성된 인스턴스를 가리키는 변수
참조 값생선된 인스턴스의 메모리 주소 값

생성자

클래스를 처음 만들 때 멤버 변수나 상수를 초기화하는 것

디폴트 생성자

자바는 따로 클래스안에서 생성자를 만들지 않아도 자바 컴파일러에서 자동으로 생성자를 만들어 줍니다. 이렇게 자동으로 만들어진 생성자를 디폴트 생성자자로 한다.

    public class Person{
        String name;
        float heigit;
        float weight;
        
        public Person() {} //자바 컴파일러가 자동으로 제공하는 디폴트 생성자
        //위 문장은 작성하지 않아도 자동으로 생성됨
        //이렇게 만들어진 생성자는 매개변수x, 구현코드x
    }

디폴트 생성자를 사용하지 않고 생성자 만들기

주로 생성자를 만드는 경우는 멤버변수에 대한 값을 매개변수로 받아서 인스턴스가 새로 생성될 때 멤버 변수 값들을 초기화하는 역할을 함

    public class Person{
        String name;
        float heigit;
        float weight;

        public Person(String pname) {
            name = pname;
        } //사람 이름을 매개변수로 입력받아서 Person 클래스를 생성하는 생성자
    }

이러한 경우 디폴트 생성자는 만들어지지 않기 때문에 디폴트 생성자를 사용하고 싶다면 디폴트 생성자를 추가로 구현하여야한다.
Person 클래스를 생성할 때 두 생성자 중 하나를 선택해 사용가능

   public class Person{
       String name;
       float heigit;
       float weight;
		
       public Person() {} 	
           
       public Person(String pname) {
           name = pname;
       } //사람 이름을 매개변수로 입력받아서 Person 클래스를 생성하는 생성자
   }

생성자 오버로드

클래스에 생성자가 두 개 이상 제공되는 경우(위 코드가 같은 경우)

오버로드

메서드 이름이 같고 매개변수만 다른 경우 오버로드라고 함

참조 자료형

크기가 정해진 기본 자료형 : int, char, float, double 등
클래스 자료형으로 선언하는 참조 자료형 변수 : String, class(Subject)

package exam;

public class Subject{
    String SubjectName;
    int scorePoint;

}
package exam;

public class Student3{
    int StudentID;
    String studentName;
    Subject korean;
    Subject math;
}
package exam;

public class Test {
    public static void main(String[] args) {
        Student3 std = new Student3();
        std.StudentID = 1234;
        std.studentName = "ads";
        std.korean.SubjectName = "aaa";
        std.korean.scorePoint = 12;
        std.math.SubjectName = "bbb";
        std.math.scorePoint = 145;

        System.out.println(std.studentName + "\n" + std.StudentID+ "\n" +std.korean.SubjectName+ "\n" +std.math.scorePoint);

    }
}

위 코드와 같이 Student3클래스 안에 참조자료형 Subject클래스를 넣은 뒤 사용해 보았다. 그랬더니


위와 같이 std.korean에 null 값이 들어가있는 오류가 발생함

왜냐!
String같은 참조형 변수는 기본 자료형과 같이 바로 사용할 수 있는게 있지만 그 외의 참조형 변수는 생성자를 구현해야 사용가능하다.

해결방법

package exam;

public class Student3 {
    int StudentID;
    String studentName;
    Subject korean;
    Subject math;

    public Student3 (int id, String name){
        StudentID = id;
        studentName = name;

        korean =new Subject();
        math = new Subject();

    }

    public void setKoreanSubject(String name, int score){
        korean.SubjectName = name;
        korean.scorePoint = score;
    }
    public void setMathSubject(String name, int score){
        math.SubjectName = name;
        math.scorePoint = score;

    }
    public void showStudentScore(){
        int total = korean.scorePoint + math.scorePoint;
        System.out.println(studentName+ "학생의 총점은"+ total+"입니다.");
    }

}
public class Test {
    public static void main(String[] args) {
        //MiddleExam.quiz1();
        Student3 std = new Student3(100, "신범철");
        std.setKoreanSubject("국어",100);
        std.setMathSubject("수학",90);

        Student3 std2 = new Student3(101,"김지용");
        std2.setMathSubject("수학",90);
        std2.setKoreanSubject("국어",70);

        std.showStudentScore();
        std2.showStudentScore();
    }
}

위와 같이 Student클래스 내 생성자를 구현할때 같이 korean과 math를 참조 변수로 하는 Subject 인스턴스를 생성해야한다.
그리고 과목과 이름을 입력받을수 있는 setSubject메서드를 만들어야한다.

Test클래스에서 Student 인스턴스를 생성한뒤 setSubject를 통해 값을 대입한뒤에 사용해야한다.

이걸로 알수있는 것은 참조형 변수를 사용한다는 것은 클래스에 인스턴스를 생성해서 사용한다는 것으로 정의 할수 있다.

정보 은닉

정보 은닉이란 private 키워드를 사용하여 외부에서 클래스 내부에 정보에 접근하지 못하도록 하는 기능

정보 은닉은 객체지향 프로그램밍의 특징중 하나!
객체지향 프로그램밍(OOP)의 특징

  • 은닉
  • 상속
  • 다형성
  • 추상화

정보 은닉을 사용하는 이유

프로그래머가 의도하지 않은 값(오류)가 나오는 것을 방지하게 위해 get~ or set~메서드를 사용하여 프로그래머가 의도한 값만 나올 수 있게 하기 위해 정보 은닉을 사용한다.

접근 제어자

클래스를 만들고 멤버 변수, 메서드, 생성자 들을 만들 때 public 예약어를 많이 사용했다.
객체 지향 프로그램에서 예약어는 클래스 내부의 변수나 메서드, 생성자에 대한 접근 권한을 지정할 수 있다. 이러한 예약어를 '접근 제어자'라고 한다.

public예약어로 선언한 변수 or 메서드는 외부 클래스에서 접근이 가능하다.
private예약어로 선언한 변수 or 메서드는 외부 클래스에서 접근이 불가능하다.
protected예약어로 선언한 변수 or 메서드는 상속될 때 private변수 or 메서드는 public하게 오픈하고 싶을 때 사용
default예약어는 기본 예약어로 같은 패키지내에서만 참조할 수 있게 허용하는 기능이다.

profile
https://github.com/beombu

0개의 댓글