본문 바로가기

자바스프링웹공부(2024)/자바

2024.08.26.클래스, 인스턴스

반응형

* 클래스 정의

- 객체를 나타내는 (생성하는, 찍어낼) 설계도!
- 표현하려는 대상 객체의 이름을 지정하여 클래스를 정의함.
- 클래스 내의 멤버변수는 인스턴스 생성 시 각 인스턴스마다 별도의 공간을 할당 
  => 이때, 각 멤버변수는 자동으로 기본값으로 초기화가 수행됨.
- 클래스 내의 메서드는 인스턴스 생성 후 호출을 통해 작업을 수행하게 됨.
- 클래스 정의 후에는 반드시 인스턴스화를 통해 메모리 상에 실제 객체를 생성해야 함.

 
[ 기본문법 ]
[접근제한자] class 클래스명 {
   멤버변수(= 객체의 정보를 저장할 변수 = 속성 = 필드)
   생성자(= 객체 생성 시 객체의 정보를 초기화하는 역할)
   메서드(= 객체의 수행할 동작 = 기능)
}


*클래스의 구성요소
1. 멤버변수(필드)
 • 속성을 저장하는 곳
 • 로컬변수는 메소드 내에서 사용되고 소멸
 • 멤버변수는 객체(인스턴스)가 소멸되기 전까지 존재
2. 생성자
 • 메소드와 유사하나 클래스이름과 동일하며 리턴타입이 없음
3. 메소드
 • 어떠한 동작 및 객체간의 데이터를 전달하는 수단으로 사용

*멤버 변수 선언
 • 멤버 변수의 선언은 클래스 {} 어디서든 존재 가능.
 • 생성자와 메소드 {} 내부에서는 선언될 수 없다.  (생성자와 메소드 {} 내부는 모두 로컬 변수)
 • 변수 선언과 동일하지만 변수라고 부르지 않음. (멤버변수 또는 필드) 

*멤버 변수의 사용
• 클래스 외부에서 사용할 때는 객체 생성(인스턴스화)뒤 사용

 

*클래스 정의하기
 예) 사람(Person) 클래스 정의 2단계
      1단계. 분석 단계 (객체 모델링)
                - 속성: 이름, 나이, 성별, 주민번호, 전화번호, ... 
                - 기능: 걷다, 앉다, 웃다, 말하다, 먹다, ...
       2단계. 설계 단계 (클래스 정의)
                - 클래스명: 사람 = Person
                - 멤버변수(속성): 이름(name, 문자열=String), 나이(age, 정수 = int), ...
                - 메서드(기능):
                    1) 먹다() = eat(): 파라미터 X, 리턴 X
                    2) 말하다() = talk() : 파라미터 X, 리턴 X
- 하나의 소스파일(.java) 내에 복수개의 클래스 정의 가능
- 단, 파일명과 동일한 클래스에만 public 접근제한자를 붙이고 
-  나머지 클래스에는 public을 붙이지 않도록 한다. 



* 클래스의 객체 (인스턴스 = instance) 생성 = 인스턴스화

  - new 키워드를 사용하여 인스턴스 생성
     =>  Heap 공간의 특정 위치에 클래스에 대한 인스턴스가 생성됨.   또한, 생성된 공간의 주소값이 리턴됨.

 

  < 클래스 인스턴스 생성 기본 문법 >
  클래스명 변수명;
  변수명 = new 클래스명();
      ==> 두 문장을 한 문장으로 결합할 경우
  클래스명 변수명 = new 클래스명;


* 인스턴스 생성하기

// 1. Person 타입 변수 p를 선언함.
Person p; // 참조 데이터타입 변수 p를 선언(Stack에 p 저장함.(타입 앞에 대문자가 붙으면 다 참조타입이다. String,...)
System.out.println(p); // 초기화가 되어 있지 않아서 에러가 남.
// 2. Person 클래스의 인스턴스를 생성하여 변수 p에 해당 인스턴스 주소 저장
p = new Person(); // Heap 공간에 생성된 인스턴스 주소가 리턴되어 p에 저장됨.
// 3. 위 두문장을 한문장으로 결합.
Person p = new Person();


/* 인스턴스 출력하기*/
// 참조변수(p)를 통해 인스턴스에 접근하여 멤벼변수 값을 출력하고, 메서드 호출
// 1. 멤버변수 값 출력 (자동으로 초기화 수행됨.)
System.out.println("이름(p.name) : " + p.name); // Heap에 저장된 것들은 기본값이 탑재됨. 기본값 : null
System.out.println("나이(p.age) : " + p.age); // 기본값 : 0
System.out.println("배고픔?(p.isHungry) : " + p.isHungry); // 기본값 : false

// 2. 메서드 호출
p.eat();
p.talk();


/* 인스턴스의 멤버변수 초기화 (값 저장) */
// 참조변수명.멤버변수명 = 값;
//  메인메서드에서 다시 값을 덮어서 사용가능함.
p.name = "홍길동";
p.age = 20;
p.isHungry = true;

p.eat();
System.out.println("이름(p.name) : " + p.name); 
System.out.println("나이(p.age) : " + p.age); 
System.out.println("배고픔?(p.isHungry) : " + p.isHungry); 


******************************* 
// 자신의 클래스에서 선언된 멤버변수는 클래스 내의 모든 메서드에서 접근가능
// => 이때, 별도의 주소 지정없이 변수명만으로 접근가능
// => 각 인스턴스에서 동일한 메서드를 호출하더라도 인스턴스마다 멤버변수가 다르므로 실행 시 실제 저장된 데이터들은 서로 다름.




/** 중복되는 코드는 메서드로 관리함. */
/* showInfo(), getTotal() */

class Student {
// 멤버변수(인스턴스 변수)는 초기값을 지정해도되고, 생략도 가능.
//  => 만약, 초기값을 지정할 경우 인스턴스를 생성할 때마다 해당 초기값으로 초기화
// 초기값 지정을 생략하는 경우 기본값으로 자동 초기화.
String name = "홍길동"; // 생성시 기본값 설정. 모든 인스턴스에서 name의 기본값을 "홍길동"으로 갖게 됨.
String id;
int age = 10;
int kor;
int eng;
int mat;

// 파라미터, 리턴 X 다음과 같이 출력함.
void showInfo() {
    // 자신의 클래스에서 선언된 멤버변수는 클래스 내의 모든 메서드에서 접근가능
    // => 이때, 별도의 주소 지정없이 변수명만으로 접근가능
    // => 각 인스턴스에서 동일한 메서드를 호출하더라도 인스턴스마다 멤버변수가 다르므로 실행 시 실제 저장된 데이터들은 서로 다름.
    System.out.println("이름: " + name);
    System.out.println("학번: " + id);
    System.out.println("나이: " + age);
    System.out.println("국어점수: " + kor);
    System.out.println("영어점수: " + eng);
    System.out.println("수학점수: " + mat);
}
// 총점을 계산하여 리턴하는 getTotal() 메서드 정의
public int getTotal() {
	return kor + eng + mat;
}
public double getAverage() {
	// double avg = getTotal()/3; // int 두개를 계산해서 double 에 넣으면 76.0이 되어버림
	// double avg = getTotal()/3.0; // 한개를 더블로 해서 계산하면 뒤에 소숫점이 나옴
	return getTotal()/3.0; // 합계 계산 코드를 직접 작성핮 ㅣ않고, 기존의 getTotal() 메서드를 재사용
}
반응형