본문 바로가기

Developer/JAVA

[JAVA] 클래스와 객체1

<객체 지향 프로그래밍과 클래스>

객체 지향 프로그램 : 어떤 대상(객체)을 가지고 프로그래밍한다.

  • 먼저 객체를 만들고 객체 사이에 일어나는 일을 구현하는 것

 

클래스 : 객체의 속성과 기능을 코드로 구현한 것.

  • 객체를 클래스로 구현하는 것 == 클래스를 정의한다.
  • 클래스의 속성은 클래스 내부에 변수로 선언한다. -> 멤버 변수
public class Student { // public : 접근 제어자, class : 클래스 만드는 예약어, Student : 클래스 이름
  // 멤버변수
  int studentID; // 학번
  String studentName; // 학생 이름
  int grade;
  String address;
  
  // 메서드(멤버함수) 추가
  public void showStudentInfo(){
    System.out.println(studentName + "," + address);
  }
}

클래스 이름 규칙

  • 자바에서 클래스 이름은 대문자로 시작
    • 소문자로 시작한다고 오류발생하는건 아니지만, 개발자들 사이의 규칙

패키지 : 클래스 파일의 묶음

  • 패키지를 만들면 프로젝트 하위에 물리적으로 디렉터리 생성

 

<메서드>

메서드는 함수(function)의 한 종류.

int add (int num1, int num2){ // int : 함수 반환형, add: 함수 이름, (int num1, int num2) : 매개변수
  int result;
  result = num1 + num2;
  return result; // return 예약어
}

 

package classpart;

public class FunctionTest{
  public static void main(String[] args) {
    int num1 = 10;
    int num2 = 20;
    
    int sum = add(num1, num2);
    System.out.println(num1 + " + " + num2 + " = " + sum + "입니다.");
  }
  
  public static int add(int n1, int n2) {
    int result = n1 + n2;
    return result;
  }
  
  public static int minus(int n1, int n2) {
    int result = n1 - n2;
    return result;
  }
}

 

<클래스와 인스턴스>

package classpart;

public class Student {
  int studentID;
  String studentName;
  int grade;
  String address;
  
  public String getStudentName(){
    return studentName;
  }
  
  // 메인함수
  public static void main(String[] args) {
    Student studentAhn = new Student(); // Student 클래스 생성
    studentAhn.studentName = "안연수";
    
    System.out.println(studentAhn.studentName); // 안연수
    System.out.println(studentAhn.getStudentName()); // 안연수
  }
}

public class StudentTest{
  public static void main(String[] args) {
    Student studentAhn = new Student(); // Student 클래스 생성
    studentAhn.studentName = "안승연";
    
    System.out.println(StudentAhn.studentName);
    System.out.println(studentAhn.getStudentName());
  }
}

 

생성된 클래스의 인스턴스 == 객체

학생 > Student 클래스 > 인스턴스

 

package classpart;

public class StudentTest1 {
  public static void main(String[] args) {
    // 서로 다른 인스턴스 두개 생성 (student1, student2)
    Student student1 = new Student();
    student1.studentName = "안연수"; // 멤버 변수 사용
    System.out.println(student1.getStudentName()); // 메서드 사용
    
    Student student2 = new Student();
    student2.studentName = "안승연";
    System.out.println(student2.getStudentName());
  }
}

인스턴스를 생성했을 때, 각 student는 studentID, studentName 등의 멤버 변수를 가지고 있고,

이 변수를 저장하기 위해 사용하는 메모리 공간이 힙 메모리.

 

Student studentAhn = new Student();

위와 같이 생성된 클래스를 studentAhn 변수에 대입하면, 인스턴스가 저장된 메모리를 studentAhn 변수가 가리킨다.

 

힙 메모리?

힙(heap)은 프로그램에서 사용하는 동적 메모리(dynamic memory) 공간을 말한다.

일반적으로 프로그램은 스택, 힙, 데이터 세 영역을 사용하는데, 객체가 생성될 때 사용하는 공간이 힙이다.

힙은 동적으로 할당되며, 사용이 끝나면 메모리를 해제해주어야하고,

C나 C++언어에서는 프로그래머가 직접 메모리를 해제해야 하지만, 자바에서는 가비지 컬렉터(garbage collector)가 자동으로 메모리를 해제한다.

 

각 클래스가 생성될 때 마다 (student1, student2) 인스턴스는 달느 메모리 공간을 차지한다.

  -> 멤버 변수를 저장하는 공간이 매번 따로 생긴다

  -> 그래서 클래스에서 선언한 멤버 변수를 달느 말로 인스턴스 변수라고 부름

 

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

 

<생성자>

package constructor;

public class Person {
    String name;
    float height;
    float weight;
}
package constructor;

public class PersonTest{
    public static void main(String[] args){
        Person personLee = new Person(); // 생성자 : Person()
    }
}

 

생성자는 클래스를 생성할 때만 호출한다.

생성자가 하는 일은 클래스를 처름 만들 때 멤버 변수나 상수를 초기화하는 것입니다.

 

생성자가 없는 클래스는 클래스 파일을 컴파일할 때 자바 컴파일러에서 자동으로 생성자를 만들어 준다. -> 디폴트 생성자 (default constructor)

  - ex ) public Person() {} : 디폴트 생성자는 매개변수, 구현 코드 모두 없다.

 

package constructor;

public class Person{
  String name;
  float height;
  float weight;
  
  public Person() {} // 23번째 줄 new Person 에러 발생하지 않게 하기 위해 디폴트 생성자 추가
  
  // pname을 매개변수로 입력 받아서 Person 클래스를 생성하는 생성자
  public Person(String pname) {
    name = pname;
  }
}


===========================================================

package constructor;

public class PersoTest{
  public static void main(String[] args) {
    Person personLee = new Person(); // 오류 발생 : Person 클래스에 디폴트 생성자가 없기 때문
  }
}

생성자 오버로드 : 클래스에 생성자가 두 개 이상 제공되는 경우

  • 클래스에서 생성자를 여러 개 제공하면 이 클래스를 사용하는 코드에서 원하는 생성자를 선택해 사용 가능

 

package constructor;

public class Person {
  String name;
  float height;
  float weight;
  
  public Person() {} // 디폴트 생성자
  
  public Person(String pname){ // 이름을 매개변수로 입력받는 생성자
    name = pname;
  }
  
  public Person(String pname, float pheight, float pweight) { // 이름, 키 몸무게를 매개변수로 입력 받는 생성자
    name = pname;
    height = pheight;
    weight = pweight;
  }
}


==============================================

package constructor;

public class PersonTest {
  public statis void main(String[] args) {
    Person personKim = new Person(); // 디폴트 생성자로 클래스 생성 후 인스턴스 변수 값을 때로 초기화
    personKim.name = "김유신";
    personKim.weight = 85.5F;
    personKim.height = 180.0F;
    
    Person personLee = new Person("이순신", 175, 75); // 인스턴스 변수 초기화와 동시에 클래스 생성
  }
}

 

<참조 자료형>

기본 자료형(int, char, float, double 등) 으로 선언하는 변수 외에,

클래스 자료형으로 선언하는 참조 자료형 변수가 있다.

package reference;

public class Subject{
  String SubjectName;  // JDK(Java Development Kit) 에서 제공하는 참조 자료형
  int scorePoint;
}

public class Student1{
  int studentID;
  String studentName;  // JDK(Java Development Kit) 에서 제공하는 참조 자료형
  Subject korean; // Subject형을 사용하여 선언
  Subject math;
  
}

 

<정보 은닉>

접근제어자(access modifier) : 예약어를 사용해 클래스 내부의 변수나 메서드, 생성자에 대한 접근 권한 지정 가능

 

package hiding;

public class Student{
  int studentID;
  private String studentName;  // studentName 변수를 private으로 선언
  int grade;
  String address;
  
  public String getStudentName(){
    return studentName;
  }
  
  public void setStudentName(String studentName){
    this.studentName = studentName;
  }
}


public class StudentTest{
  public static void main(String[] args) {
    Student studentLee = new Student();
    studentLee.studentName = "Tom"; // 오류 발생
    
    System.out.println(studentLee.getStudentName());
  }
}
  • studentName 변수의 접근 제어자가 public 일 때는 외부 클래스인 StudentTest 클래스에서 변수에 접근할 수 있었지만,
    private으로 바뀌면서 외부 클래스의 접근이 허용되지 않음

 

get(), set() 이용해서 접근하기

public class Student{
  int studentID;
  private String studentName;
  int grade;
  String address;
  
  public String getStudentName(){
    return studentName;
  }
  
  public void setStudentName(Stinrg studentName){
    this.studentName = studentName;
  }
}

public class StudentTest{
  public static void main(String[] args){
    Student studentLee = new Student();
    // studentLee.studentName = "Tom";
    studentLee.setStudentName("Tom"); // setStudentName() 메서드를 활용해 private 변수 접근 가능
    
    System.out.println(studentLee.getStudentName());
  }
}
    

 

접근 제어자 설명
public 외부 클래스 어디에서나 접근 가능
protected 같은 패키지 내부와 상속 관계의 클래스에서만 접근할 수 있고
그 외 클래스에서는 접근 불가
아무것도 없는 경우 default 이며 같은 패키지 내부에서만 접근 가능
private 같은 클래스 내부에서만 접근 가능

'Developer > JAVA' 카테고리의 다른 글

[JAVA] 배열과 ArrayList  (0) 2021.07.08
[JAVA] 클래스와 객체2  (0) 2021.06.28
[JAVA] 조건문, 반복문 (if, for)  (0) 2021.05.17
JAVA 변수 선언하기  (0) 2021.05.14