TIL 9일차. 클래스

김기현·2025년 2월 20일

1.클래스 (Class)

클래스 선언

[접근제한자] [예약어] class 클래스명{
	[접근제한자] [예약어] 자료형 변수명; // 속성값 설정

	[접근제한자] 생성자명(){}

	[접근제한자] 반환형 메소드명(매개변수){ //기능의 설정
	//기능정의
	}
}
	

클래스 접근제한자

public : 모두 접근 가능 // +
(default) : 같은 패키지 내에서만 접근 가능 // ~ : 틸드(tilde)

2.필드(Field)

필드 표현식

[접근제한자][예약어] 자료형 변수명 [=초기값];

필드 접근제한자
public : 모두 접근 가능 // +
protected : 같은 패키지와 후손 클래스내에서 접근 가능 // #
(default) : 같은 패키지 내에서만 접근 가능 // ~
private : 해당 클래스 내부에서만 접근 가능 // -

*상속 : 부모 클래스로부터 사용을 허가 받는 것 // 클래스 선언부 extends [부모클래스명]

필드 예약어 - static

같은 타입의 여러 객체가 공유할 목적의 필드에 만들며 프로그램 시작시 static 영역에 자동할당 되는 멤버에 적용

stack, Heap : 동적 메모리 영역 코드 해석시 메모리가 할당, 삭제되는걸 반복
static : 정적(공유) 메모리 영역에서 프로그램 시작~종료까지 계속 존재

필드 예약어 - final

하나의 고정된 값만을 저장해야하는 변수에 사용하는 예약어

*final이 붙은 private 변수에는 변수의 재대입이 불가능하므로 setter 설정이 불가능하다

3.생성자(Constructor)

생성자란?

객체가 new 연산자를 통해 Heap 메모리 영역에 할당될 때 객체가 안에서 만들어지는 필드 초기화 + 생성 시 필요한 기능을 수행한다. 생성자는 일종의 메소드로 전달된 초기값을 받아서 객체의 필드에 기록한다

생성자 규칙
생성자의 선언은 메소드 선언과 유사하나 반환값이 없으며 생성자명을 클래스명과 똑같이 지정해야한다

생성자 표현식

[접근제한자][예약어] class 클래스명 {
[접근제한자] 클래스명(){} // ()안에 아무것도 없는 형태를 기본생성자라 한다
[접근제한자] 클래스명(매개변수){(this.)필드명=매개변수;}
}

*생성자를 따로 생성하지 않을 경우 컴파일러 작동시 자동으로 기본생성자를 생성한다

*매개변수 생성자는 객체 생성 시 전달 받은 값으로 객체를 초기화하기 위해 사용하며 매개변수 생성자 작성 시 컴파일러가 기본 생성자를 자동으로 생성하지 않는다. 또한 오버로딩을 통해 작성해야 한다

*this 생성자는 같은 클래스의 다른 생성자를 호출하여 사용할 때 사용한다. 오버로딩을 사용한 매개변수 생성자를 호출할 경우 그에 따른 매개변수를 기입해야한다

기본 생성자 예시 : public User(){}
단축키 : ctrl + space + enter

매개변수 생성자 예시 : public User(String userId){this.userId=userId;}
단축키 : alt + shift + s → Generate Constructor using Field

this 생성자 예시 : this(String userId); // 위의 매개변수 생성자를 호출한다

오버로딩

오버로딩이란 한 클래스 내에 동일한 이름의 메소드를 여러 개 작성하는 기법이다

오버로딩의 조건
-메소드의 이름이 동일해야 한다
-매개변수의 자료형, 개수, 순서 중 하나라도 달라야한다
-메서드에서 사용할 경우 리턴타입은 같거나 달라도 상관없다

다음은 오버로딩을 이용하여 작성된 기본생성자와 매개변수 생성자의 예시이다

//기본 생성자  (매개변수가 없는 생성자)
public User() {
	//기능
	System.out.println("기본생성자로 User 객체 생성");
	
	//필드 초기화
	userId = "user01";
	userPw = "pass01";
	userName = "홍길동";
	userAge = 20;
	userGender = '남';




//매개변수 생성자
public User(String userId, String userPw) {
	System.out.println("매개변수 생성자를 이용하여 User 객체		 생성");
	
	//필드 초기화
	this.userId=userId;
	this.userPw=userPw;




//this()생성자
public User(String userId, String userPw, String userName, int 	userAge, char userGender) {
	
	//this()생성자 : 같은 클래스의 다른 생성자를 호출할 때 사용
	this(userId, userPw)
	this.userName=userName;
	this.userAge=userAge;
	this.userGender=userGender;

다음은 오늘 진행한 생성자 예제에 대한 풀이다.

예제의 조건은 다음과 같다.
링크텍스트

1)Hero 클래스

package edu.kh.oop.practice.model.vo;
public class Hero {

private String nickname;
private String job;
private int hp;
private int mp;
private int level;
private double exp;

public Hero() {
}
public Hero(String nickname, String job, int hp, int mp, int level, double exp) {
	super();
	this.nickname = nickname;
	this.job = job;
	this.hp = hp;
	this.mp = mp;
	this.level = level;
	this.exp = exp;
	
	System.out.println("==============캐릭터 생성=================");
	System.out.printf("%s 직업으로 '%s'님이 생성되었습니다\n현재 레벨 : %d\n현재 hp : %d\n현재 mp : %d\n현재 경험치 : %.1f\n"
			,job, nickname, level, hp, mp, exp);
	
	
}

public void attack() {
	exp+=150.5;
	exp=Math.round(exp*1000)/1000;
	System.out.printf("'%s'은/는 공격을 했다!!! 현재 경험치 : %.1f\n",nickname, exp);
	if(exp/300>level) {
		level++;
		System.out.println("레벨이 올랐습니다!! 현재레벨 : "+level);
	}
}
public void dash() {
	
	if(mp>0) {
		mp-=10;
		System.out.println("'"+nickname+"'의 엄청 빠른 대시!! 남은 마력 : "+mp);
	}else {
		System.out.println("[마력 부족] 더 이상 대시 할 수 없어요~!");
	}
}
@Override
public String toString() {
	
	return "========'"+nickname+"'님의 정보========\n"+"-현재 레벨 : "+level
			+"\n-현재 hp : "+hp+"\n-현재 mp : "+mp+"\n-현재 exp : "+ exp;
}
public String getNickname() {
	return nickname;
}
public void setNickname(String nickname) {
	this.nickname = nickname;
}
public String getJob() {
	return job;
}
public void setJob(String job) {
	this.job = job;
}
public int getHp() {
	return hp;
}
public void setHp(int hp) {
	this.hp = hp;
}
public int getMp() {
	return mp;
}
public void setMp(int mp) {
	this.mp = mp;
}
public int getLevel() {
	return level;
}
public void setLevel(int level) {
	this.level = level;
}
public double getExp() {
	return exp;
}
public void setExp(double exp) {
	this.exp = exp;
	}
}

2)HeroService 클래스

package edu.kh.oop.practice.model.service;
import edu.kh.oop.practice.model.vo.Hero;
public class HeroService {
public void practice() {
	
	Hero hero = new Hero("이구역짱", "전사", 200, 20, 1,0);
	
	Hero hero2 = new Hero("Zi존위자드","마법사",100,100,1,0);
	
	System.out.println("========"+hero.getNickname()+"========");
	hero.attack();
	hero.attack();
	hero.attack();
	hero.dash();
	hero.dash();
	hero.dash();
	System.out.println(hero.toString());
	
	System.out.println("========"+hero2.getNickname()+"========");
	hero2.attack();
	hero2.dash();
	hero2.attack();
	hero2.attack();

	System.out.println(hero2.toString());
	}
}

3) PracticeRun 클래스

package edu.kh.oop.practice.run;
import edu.kh.oop.practice.model.service.BookService;
import edu.kh.oop.practice.model.service.HeroService;
public class PracticeRun {
public static void main(String[] args) {

	HeroService heroser = new HeroService();
	heroser.practice();
	
	}
}
profile
모든게 처음

0개의 댓글