[Java] 클래스와 객체

hyem·2021년 7월 29일
0

Java

목록 보기
2/3
post-thumbnail

1. 객체(Object)

: 객체는 현실세계에 존재하는 모든 사물이 될 수 있다.

  • 예) 아침에 일어나 버스를 타고 학교에 가는 과정을 프로그래밍한다고 가정
    • '학생', '아침밥', '버스', '학교' 등등의 객체 정의
    • 객체 사이에 일어나는 일들을 구현
      = 객체지향 프로그래밍 (OOP, Object Oriented Programming)

2. 클래스(Class)​

객체의 속성과 기능을 코드로 구현한 것.
'객체를 만들어내기 위한 틀' 이라고 생각하면 됨

1) 클래스 정의

예) 자동차 클래스 만들기

  • 🚗 자동차
    • 속성 : 이름, 제조사, 연식, 가격 등등
      => 변수로 정의
    • 기능 : 출발하다, 멈추다 등등
      => 메서드로 정의
class Car{
    // 속성(필드) : 멤버 변수(member variable)
    String name;
    String maker;
    int year;
    double price;

    // 기능 : 메서드(method)
    void start() {
        System.out.println("출발");
    }
    void stop() {
        System.out.println("멈춤");
    }
    

(1) 멤버변수

: 클래스 내부에 선언되어 객체의 속성을 나타내는 변수

(2) 메서드

: 클래스 내부에서 멤버변수를 사용하여 클래스의 기능을 구현한 것

  • 메서드 정의하기
    : 반환형 메소드이름 (매개변수) { }

  • return값이 없는 메소드의 경우 반환형은 void 이다.

(3) 로컬변수

: 메서드의 내부 {} / 메서드의 매개변수로 () / 생성자의 매개변수로 () 내부에 선언되는 변수

  • 메서드 또는 생성자를 호출하는 시점에 💎스택 메모리💎에 생성, 메서드가 종료되면 메모리에서 삭제됨

2) 클래스를 통한 객체 생성

(1) 인스턴스 (Instance)

실제로 사용할 수 있도록 생성된 클래스.
클래스를 이용해서 생성한 객체 = 인스턴스

  • 객체 생성 문법 :
    자료형(클래스형) 변수이름 = new 생성자;
  • 객체가 생성된다 = 클래스를 실제 사용할 수 있도록 메모리(💎힙 메모리💎) 공간을 할당받는다.
  • 생성된 인스턴스를 가리키는 변수 = 참조변수
public class Student {  // 클래스 정의
	// 멤버변수
	int studentID;
	String studentName;
	int grade;
	String address;
	
	// 메서드
	public String getStudentName() {
		return studentName;
	}
	public void setStudentName(String name) {
		studentName = name;
	}
    
   	// main함수 : Java Virtual Machine이 프로그램을 시작하기 위해 호출하는 함수.
    	// 클래스 내부에 만들긴 하지만 클래스의 메서드는 아님
	public static void main(String[] args) {
		
        	// 객체 생성
        	Student student1 = new Student();
		Student student2 = new Student();
		
        	// 클래스를 참조하는 참조변수를 통해 멤버변수와 메서드 호출
		student1.studentName = "김철수";
		student2.studentName = "홍길동";		
		System.out.println(student1.getStudentName());  // 김철수 출력
	}

}

3) 생성자 (Constructor)

객체를 생성할 때 사용하는 일종의 함수.

(1) 기본 생성자 (default constructor)

  • 생성자 이름은 클래스 이름과 같다.
  • 반환타입이 없다. (반환타입이 void인 것과 다르다)
  • 클래스를 정의할때 생성자를 명시적으로 만들지 않는다면, 컴파일 시에 자바가 알아서 기본 생성자를 만들어준다.

(2) 생성자 직접 구현

  • 필요에 따라 직접 생성자 구현 가능
    ⚡주로 멤버변수의 값들을 매개변수로 받아서 객체(인스턴스)가 생성될 때 멤버 변수 값을 초기화하는 역할⚡
  • 직접 생성자를 구현한 경우 기본생성자는 자동으로 만들어지지 않는다. (기본 생성자도 필요하면 명시적으로 구현해야 한다)

(3) 생성자 오버로드 (constructor overload)

  • 클래스에 생성자를 두 개 이상 제공
  • 필요에 따라 생성자를 선택해 사용
public class Student {
	// 멤버변수
	int studentID;
	String studentName;
	int grade;
	String address;
	
	// 기본 생성자
	Student(){};
	
	// 직접 구현한 생성자 (멤버변수 studentID의 값을 초기화)
	Student(int id){
		studentID = id;
	}
	
	// 메서드
	public String getStudentName() {
		return studentName;
	}
	public void setStudentName(String name) {
		studentName = name;
	}
	
	
	
	public static void main(String[] args) {
    		// 클래스 생성 - 기본생성자 사용
		Student student1 = new Student(); 
        
       		// 클래스 생성 - 직접 구현한 생성자 사용
		Student student2 = new Student(123);				
			
		System.out.println(student2.studentID);  // 123 호출
	}

}

생성자 오버로드를 이해하기 위한 개념
💡 메소드 오버로드 (method overload)

  • 같은 클래스 안에 여러 메소드 존재
  • 메소드들의 이름은 다 같음 (반환 타입/접근제한자는 상관없음)
  • 메소드 매개변수의 갯수나 타입이 다름 (갯수와 타입이 둘다 같으면 안됨)
public class Test {
    static void testMethod(int i) {
        System.out.println("int call");
    }
    static void testMethod(float f) {
        System.out.println("float call");
    }public static void main(String[] args) {
        int a = 1;
        float b = 1.1;testMethod(a);  // "int call"  
        testMethod(b); // "float call"        
    } 
  • 매개변수에 따라 필요한 메소드를 골라서 사용 가능하다

3. 참조 자료형

  • 변수의 종류
    • 기본 자료형 (이전 포스팅 참고)
    • 참조 자료형
      : 클래스를 자료형으로 삼음 (해당 클래스를 참조하는 변수)

앞서 만든 학생 클래스에 '수강하는 과목'이라는 변수를 추가하고 싶다.
과목들에 대한 속성을 각각 변수로 추가하면 비효율적이니, Subject라는 클래스를 만들어서 Subject형 변수를 선언해보자.

<Subject.java>

// Subject 클래스 만들기
public class Subject {
	String subjectName;
    	int subjectScore;        
}

<Student.java>

public class Student {
	
	int studentID;
	String studentName;	
	// Subject형 변수 선언
	Subject subject;
	
	void setSubject(String name, int score) {
		this.subject = new Subject(); // Subject 객체를 생성해야 사용할 수 있음
		subject.subjectName = name;
		subject.subjectScore = score;				
	}
	
	
	
	public static void main(String[] args) {
		Student student1 = new Student();        
		student1.setSubject("math", 90);
						
		System.out.println(student1.subject.subjectName);  // math 출력
	}

}
  • 참조형 변수는 새로운 클래스를 만들어서 사용할 수도 있고, JDK에서 제공하는 클래스를 사용할 수도 있다.
    • 예) String은 java.lang 패키지 내에 있는 클래스이다.
  • 기본형 변수는 메모리에 생성되면 실제 값(리터럴)을 저장한다.
  • 참조형 변수는 메모리에 생성되면 참조하는 클래스의 주소값을 저장한다.

0개의 댓글