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();
}
}