- 현실에서 사용하고 있는 모든 것
OR 현실에 없는 것들을 프로그래밍 언어에 추상적으로 구현한 것- 인스턴스를 포함하는 일반적 의미
- 속성(변수)과 기능(메서드)으로 이루어짐
- 속성을 필드 / 멤버 변수, 기능을 메소드(함수)라고 함.
추상적인, 구체적인 설계도 (같은 종류를 묶어 놓은 것) **
추상 클래스 (가구) : 사람이 상상해서 그 물건의 특성을 떠올릴 수 있지만 실제 만들 수 없는 것
구체 클래스 (의자) : 상상 가능하고 제조법이 명확
정의 : 객체를 정의해놓은 것
용도 : 객체를 생성함
실제로 존재할 수 있는 것을 상상 (만들어질 의자를 머리 속으로 상상)
클래스를 통해 object가 실체화 된 것 (실제 의자)
정의 : 실제로 존재하는 것. 사물 또는 개념
용도 : 객체의 속성과 기능에 따라 다름
package ch06;
// 고양이를 추상화
class Cat {
// 필드 (객체의 속성)
String name;
int age;
// 해답 3
// String name = "길냥이";
// int age = 1;
// 생성자 (객체 생성 시 사용)
// 인스턴스 초기화 메서드
// 이름은 클래스명과 동일하게
// 생성자가 있어야 클래스를 인스턴스화 가능
// 리턴 타입 X (무조건 void)
// ---------------------------------
// 클래스에 아무 생성자가 없을 경우
// 매개변수가 없는 생성자가 기본적으로 세팅
// public Cat() {
// System.out.println("내가 태어났다");
// }
// 다른 생성자를 만들 시 기본적으로 세팅된 생성자(매개변수 X)는 없어짐
public Cat(String name, int age){
// this는 클래스가 아니라 생성될 인스턴스를 가리킴
this.name = name;
this.age = age;
System.out.println(this.name + "가 태어났다");
}
// 길 고양이
// 일부 데이터만 받을 수 있다
// 받은 데이터 이외의 데이터는 직접 초기화
// public Cat(int age){
// this.name = "길냥이";
// this.age = age;
// System.out.println(this.name + "가 태어났다");
// }
public Cat(int age){
// this를 이용해 생성자에서 다른 생성자 호출 가능
// 보통은 매개변수가 가장 많은 생성자를 호출
this("길냥이", age);
}
// 해답 1
// public Cat(){
// this.name = "길냥이";
// this.age = 1;
// }
// 해답 2 (best)
public Cat(){
this("길냥이", 1);
}
// 해답 3
// public Cat(){
// // 필드에 값 입력
// }
// 해답 4
// public Cat(){
// this(1);
// }
// 메소드 (객체의 기능)
public void cry() {
System.out.println("야옹");
}
}
public class S01 {
public static void main(String[] args) {
// 인스턴스
// new Cat();
// 오브젝트
// 상상할 수 있지만 실체화 되지 않은 것
// Cat cat;
// 초기화 오류
// cat.cry();
// 오브젝트를 생성 후, 인스턴스를 넣어줌.
// 생성자가 요구하는 매개변수대로 작성
Cat cat = new Cat("야옹이", 2);
// Cat cat2 = new Cat(1);
cat.cry();
new Cat(1).cry();
// 문제
new Cat(); // 이름이 '길냥이'이고 나이가 1살인 고양이 생성
}
}
생성자에서 다른 생성자 호출 시 주의
class Cat{ String name; public Cat(String name){ this.name = name; } public Cat(){ String name = "길냥이"; // !오류! 다른 생성자의 호출은 무조건 첫 문장으로 // this(name); } }
package ch06;
class Dog{
String name;
int position;
public Dog(String name, int position) {
this.name = name;
this.position = position;
System.out.println(this.name + "가 태어났습니다");
}
public Dog(String name){
this(name, 0);
}
public void moveRight(){
this.position++;
System.out.println(this.name + "가 오른쪽으로 이동했습니다.");
}
public void moveLeft(){
this.position--;
System.out.println(this.name + "가 왼쪽으로 이동했습니다.");
}
}
public class S02 {
public static void main(String[] args) {
// 강아지 생성
Dog dog = new Dog("야옹이");
// 유저가 강아지를 움직임
dog.moveRight();
dog.moveRight();
// 강아지 위치 확인
System.out.println(dog.position);
}
}
package ch06;
class Cat {
String name;
int hp;
int position;
public Cat(String name, int hp, int position) {
this.name = name;
this.hp = hp;
this.position = position;
}
public Cat(String name) {
this(name, 100, 0);
}
public void moveRight() {
this.position++;
System.out.println(this.name + "가 오른쪽으로 이동했습니다");
reduceHp();
}
public void moveLeft() {
if (this.position < 1) {
System.out.println(this.name + "는 왼쪽으로 갈 수 없습니다.");
// 메서드(함수)에서 return을 만나면 종료 (뒤 코드 실행 X)
return;
}
this.position++;
System.out.println(this.name + "가 왼쪽으로 이동했습니다");
reduceHp();
}
public void reduceHp() {
this.hp--;
System.out.println(this.name + "의 체력이 내려갔습니다");
}
public void yam(int food){
if(this.hp + food >= 100){
System.out.println("체력이 가득 찼습니다");
this.hp = 100;
return;
}
this.hp = this.hp + food;
System.out.println(this.name + "가 밥을 먹었습니다" );
}
public String dong(){
return "이쁜 ㄸ";
}
}
public class S03 {
public static void main(String[] args) {
Cat cat = new Cat("야옹이");
cat.moveLeft();
cat.moveRight();
cat.yam(5);
System.out.println(cat.hp);
System.out.println(cat.dong());
}
}
package ch06;
class Cat{
// 클래스 변수 - 클래스 전체를 아우르는 데이터(클래스의 바깥에 존재) 모든 클래스가 하나의 저장공간 차지, (클래스이름.클래스변수)
// static - 정적.
static int countCat = 0;
// 인스턴스 변수 - 인스턴스 생성 시 생성, 참조변수가 없을 때 가비지 컬렉터에 의해 자동 제거 (참조변수.인스턴스 변수명)
String name;
public Cat() {
this.name = "길고양이";
Cat.addCat();
}
public static void addCat(){
Cat.countCat++;
System.out.println("새로운 고양이가 태어났습니다.");
}
}
public class S04 {
public static void main(String[] args) {
new Cat();
new Cat();
new Cat();
new Cat();
new Cat();
System.out.println("고양이의 수는 " + Cat.countCat);
}
}
- 반복적으로 수행되는 여러 문장 묶기
! 하나의 메서드는 한 가지 기능만 수행하도록 (중요)
package ch06;
// 함수를 사용하기 위한 클래스 (보통 함수 만들 때 클래스를 만들고 사용)
class CalcUtil{
// static을 사용하면 객체를 생성하지 않아도 기능 사용 가능
// 함수
// 리턴 타입 존재 할 수도 안 할 수도
// 함수의 이름은 개발자가 기능과 관련된 것으로 정하기
// 소괄호 안에는 매개변수 / 인자 / 인수
static int add(int a, int b){
// return 뒤에는 내부에서 연산된 값을 요청한 곳에 되돌려 줌
// 리턴 타입이 void라면 return이 없거나 return;으로 마무리
return a + b;
}
}
public class S05 {
public static void main(String[] args) {
// 호출된 함수(CalcUtil.add)는 결과 값으로 바뀜
// ex) 자판기에 500원을 넣으면
// 자판기에서 콜라가 나오는 것이 아니라
// 자판기 자체가 콜라가 되는 것과 비슷
int result = CalcUtil.add(2, 3);
System.out.println(result);
}
}
package ch06;
class 아이템{
String name;
int reinforce;
public 아이템(String name) {
this.name = name;
this.reinforce = 0;
}
public void reinforceItem(){
this.reinforce++;
}
}
class 강화재료{
String name;
public 강화재료(String name) {
this.name = name;
}
}
class 강화유틸 {
public static 아이템 강화하기(아이템 item, 강화재료 source){
item.reinforceItem();
return item;
}
}
public class S06 {
public static void main(String[] args) {
아이템 item = new 아이템("노가다 목장갑");
강화재료 source = new 강화재료("숯돌");
아이템 결과아이템 = 강화유틸.강화하기(item, source);
System.out.println(결과아이템.reinforce);
}
}
여러 단계로 뻗어가는 문제에서 재귀함수 사용
package ch06;
class Temp{
public static int myFunction(int b){
int a = 1;
if(a + b > 0){
System.out.println("10보다 작습니다.");
return myFunction(a + b);
}else{
return a+b;
}
}
}
public class S07 {
public static void main(String[] args) {
// Temp.myFunction(0);
// 대부분의 재귀 함수는 반복문으로 바뀔 수 있다
while(true){
System.out.println("10보다 작습니다");
}
}
}
추가) 참조형 변수 주의사항
package ch06; class Cat{ String name; public Cat(String name) { this.name = name; } } public class S10 { public static void main(String[] args) { Cat cat1 = new Cat("야옹이"); // 참조형 변수는 복사의 개념이 아닌 다른 이름은 하나 더 붙여준 것 // 같은 공간. Cat cat2 = cat // cat2의 내용을 바꾸면 cat2.name = "뚱땡이"; // cat1의 내용도 바뀜 System.out.println(cat1.name); } }