* 클래스 정의
- 객체를 나타내는 (생성하는, 찍어낼) 설계도!
- 표현하려는 대상 객체의 이름을 지정하여 클래스를 정의함.
- 클래스 내의 멤버변수는 인스턴스 생성 시 각 인스턴스마다 별도의 공간을 할당
=> 이때, 각 멤버변수는 자동으로 기본값으로 초기화가 수행됨.
- 클래스 내의 메서드는 인스턴스 생성 후 호출을 통해 작업을 수행하게 됨.
- 클래스 정의 후에는 반드시 인스턴스화를 통해 메모리 상에 실제 객체를 생성해야 함.
[ 기본문법 ]
[접근제한자] 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() 메서드를 재사용
}
'자바스프링웹공부(2024) > 자바' 카테고리의 다른 글
204.09.03.비정형인자. 기본형변수와 참조형변수. 패키지 (0) | 2024.09.03 |
---|---|
2024.08.27. 생성자, this (0) | 2024.08.27 |
2024.08.12. 메서드 (0) | 2024.08.17 |
2024.08.09. 다차원 배열 (0) | 2024.08.09 |
2024.08.06. 배열 1 (0) | 2024.08.06 |