java (3)

ysh·2023년 7월 3일
0

Spring Boot

목록 보기
18/53

객체

  • 현실에서 사용하고 있는 모든 것
    OR 현실에 없는 것들을 프로그래밍 언어에 추상적으로 구현한 것
  • 인스턴스를 포함하는 일반적 의미

  • 속성(변수)과 기능(메서드)으로 이루어짐
  • 속성을 필드 / 멤버 변수, 기능을 메소드(함수)라고 함.

class (설계도)

추상적인, 구체적인 설계도 (같은 종류를 묶어 놓은 것) **

  • 추상 클래스 (가구) : 사람이 상상해서 그 물건의 특성을 떠올릴 수 있지만 실제 만들 수 없는 것

  • 구체 클래스 (의자) : 상상 가능하고 제조법이 명확


정의 : 객체를 정의해놓은 것
용도 : 객체를 생성함

object (틀, 껍데기)

실제로 존재할 수 있는 것을 상상 (만들어질 의자를 머리 속으로 상상)

instance (실체)

클래스를 통해 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);
    }
}

static

  • 프로그램 실행 시 메모리(static)영역에 로딩, 프로그램 종료시 없어짐

stack

  • 함수를 실행할 때 stack영역에 로딩되고 함수를 종료하면 없어짐

heap

  • static이 아닌 것들을 부를 때 heap영역에 로딩되고, 직접 종료 시키면 없어짐

실행 순서

  1. 프로그램 실행
  2. 파일에 만들어 둔 클래스와
    static 변수 / 함수가 스태틱 영역에 올라간다
  3. main 함수가 실행 된다(스택 영역에 올라간다)
  4. cat 인스턴스가 만들어진다(힙 영역에 올라간다)
  5. cat.cry메소드가 실행된다(스택 영역에 올라간다)
  6. cat.cry메소드가 완료된다(스택 영역에서 내려온다)
  7. cat 인스턴스가 쓰이지 않기 때문에 가비지 컬렉션 된다
    (힙 영역에서 내려온다)
  8. main함수가 완료된다(스택 영역에서 내려온다)
  9. 프로그램이 종료된다(스태틱 영역에서 모든 데이터가 내려옴)

재귀 함수

여러 단계로 뻗어가는 문제에서 재귀함수 사용

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);
    }
}
profile
유승한

0개의 댓글