본문 바로가기

3월 ~ 5월) 자바/java

8Day - Car & CarApp (클래스) / Overload & OverloadApp(캡슐화) / Member & MemberApp

// 클래스 (Class) : 객체(Object)를 생성하기 위한 자료형 - 참조형
// > Java에서는 객체(Object) 대신, 인스턴스(Instance)라는 용어
// > 현실에 존재하는 사물 또는 관념을 클래스라는 자료형으로 표현하여 프로그램에 사용할 수 있도록 객체로 생성
// 클래스 선언 형식
// 형식) [public] class 클래스명 {
// 필드- 표현대상의 속성값을 저장하기 위한 멤버변수
// ...
// 생성자(Constructor) - 클래스로 객체를 생성하기 위한 특별한 메소드
// ...
// 메소드 (Method) - 표현 대상의 행위를 명령으로 제공하기 위한 함수 - 멤버함수
// ...
// }
// > 메소드는 필드를 사용한 명령으로 필요한 기능을 제공되도록 작성
// > 클래스 내부에 선언된 모든 메소드는 필드 접근 가능
// 클래스를 작성할때 필드와 메소드에는 접근 지정자를 사용하여 접근 허용 유무 설정 가능
// 접근 제한자(Access Modifier) - private, package(default), protected, public
// > 클래스, 필드, 생성자, 메소드를 선언할 때 접근 허용을 설정하기 위한 키워드
// private - 클래스 내부에서만 접근 가능 하도록 허용 하는 접근제한자
// > 필드, 생성자, 메소드를 은닉화 처리하기 위해 사용 - 클래스 외부에서 접근할 경우 에러 발생
// > 일반적으로 필드에 사용하는 접근 제한자 - 객체로 필드의 직접적인 접근을 제한하기 위한 사용
// > 데이터 은닉화 (Data hiding) : 값을 숨겨 보호하기 위한 기능
/ public - 모든 패키지의 클래스에서 접근 가능하도록 허용하는 접근 제한자
// > 일반적으로 메소드에 사용하는 접근 제한자 - 프로그램 작성에 필요한 모든 클래스에서 접근 할수있도록 허용
// 자동차를 객체 모델하여 클래스로 작성
// > 속성 : 모델명, 엔진상태, 현재속도
// > 행위 : 시동 온, 시동 오프, 속도 증가, 속도 감소, 이동 중지 - 메소드

 

Car

public class Car {
    // 필드
    String modelName; // 모델명
    boolean engineStatus; // 엔진상태 - (false : EngineOff / true : EngineOn )
    int currentSpeed; // 현재 속도

    // 생성자 - 생성자를 선언하지 않으면, 매개변수가 없는 기본 생성자가 자동으로 생성되어 제공

    // 메소드 - 필드를 사용하여 메소드의 명령으로 필요한 기능을 제공되도록 작성
    public void startEngine() { // 시동 온 (On)
        engineStatus = true; // 엔진상태
        System.out.println(modelName + "의 자동차 시동을 켰습니다.");
    }
public void stopEngine() { // 시동 오프(Off)
        if ( currentSpeed != 0) {
            /*
            currentSpeed = 0;
            System.out.println(modelName + "의 자동차가 멈췄습니다.");
             */

            // 클래스 내부에 선언된 메소드는 서로 호출 가능
            speedZero(); // > 코드의 중복성을 최소화 하여 프로그램의 생상성을 및 유지보수의 효율성 증가

        }

        engineStatus = false;
        System.out.println(modelName + "의 자동차 시동을 껐습니다.");
    }
public void  speedUp (int speed) { // 속도 증가
        if (!engineStatus) { // 엔진이 꺼져있는경우

            System.out.println(modelName + "의 자동차 시동이 꺼져 있습니다.");
            return; // 메소드 종료 (시동이 꺼져있는 상태면, 알려주고 꺼줌.)
        }

        if (currentSpeed + speed > 150) {
            speed = 150 - currentSpeed;
        }

        currentSpeed += speed;
        System.out.println( modelName + "의 속도가" + speed + "km/h 증가 되었습니다." +
                " 현재 속도는 " + currentSpeed + "Km/h 입니다.");
    }
public void speedDown(int speed) { // 속도 감소
        if (!engineStatus) { // 엔진이 꺼져 있는경우
            System.out.println(modelName + "의 자동차 시동이 꺼져있습니다");
            return; // 메소드 종료 (시동이 꺼져있는 상태면, 알려주고 꺼줌.)
        }

        if (currentSpeed < speed) {
            speed = currentSpeed;
        }

        currentSpeed -= speed;
        System.out.println (modelName + "의 자동차 속도가 " + speed + "km/h 감소 되었습니다." +
                "현재 속도는 " + currentSpeed + "km/h 입니다.");
    }
// 이동 중지
    public void speedZero() { // 이동 중지 (매개변수)
        currentSpeed = 0;
        System.out.println(modelName + "의 자동차가 멈췄습니다.");
    }

 

// Setter 메소드 - 매개변수로 값을 전달받아 필드값을 변경하는 메소드
// 형식) public void set필드명(자료형 변수명) { 필드명 = 변수명;}
// > 매개변수에 전달되어 저장된 값에 대한 검증 가능

 

 

public String getModelName() {
        return  modelName;
    }

    // Setter 메소드 - 매개변수로 값을 전달받아 필드값을 변경하는 메소드
    // 형식) public void set필드명(자료형 변수명) { 필드명 = 변수명;}
    // > 매개변수에 전달되어 저장된 값에 대한 검증 가능
    public void setModelName(String name) {
        // 매개변수에 저장된 값에 대한 검증
        // this - 메소드 내부에서 클래스의 객체를 표현하는 키워드
        // > this 키워드를 사용하여 필드 표현
        this.modelName = modelName; // this객체의 모델이름
    }


    // 인텔리제이에은닉화 처리된 필드에 대한 Getter 메소드와 Setter 메소드를 생성하는 기능
    // 단축키 ) Alt + Insert
    public boolean isEngineStatus() {
        return engineStatus;
    }

    public void setEngineStatus(boolean engineStatus) {
        this.engineStatus = engineStatus;
    }

    public int getCurrentSpeed() {
        return currentSpeed;
    }

    public void setCurrentSpeed(int currentSpeed) {
        this.currentSpeed = currentSpeed;
    }
}

 


// 클래스로 객체를 생성하는 방법
// 형식 ) 클래스명 참조변수 = new 클래스명();
// > new 연산자로 클래스의 생성자를 호출하여 객체를 생성하고 생성된 객체의 메모리 주고를
// 주소를 참조변수에 저장
// > 참조변수에 저장된 객체는 . 연산자를 사용하여 필드 또는 메소드에 이용해 프로그램 작성

// Car 클래스를 객체로 생성하여 작성된 프로그램
// 클래스 - 객체를 만들기위한 틀

CarApp

public class CarApp {
    public static void main(String[] args) {
        // Car 클래스를 객체를 생성하여 참조변수에 저장 ▽
        // > 하나의 클래스로 서로 다른 객체를  여러개 생성 가능 ▽
        // 객체를 생성하면 객체의 필드에서는 기본값(숫자 - 0 / 논리형 - null)을 초기값으로 자동 저장

        Car car0ne = new Car();
        Car carTwo = new Car();
        Car carThree = new Car();

        System.out.println("carOne = " + car0ne);
        System.out.println("carTwo = " + carTwo);
        System.out.println("carThree = " + carThree);

        System.out.println("-------------------------------------------------------");
        // 참조변수.필드명 : 참조변수에 저장된 객체가 . 연산자를 사용하여 필드에 접근
        // > 객체의 필드에는 기본값이 초기값으로 자동 저장
        // 문제점) 객체를 사용하여 필드에 직접적인 접근을 허용하면 필드의 비정상적인 값 저장 가능
        // 해결법) 클래스 선언시 필드를 은닉화 처리하여 선언 - 은닉화 선언된 필드에 접근할 경우 에러 발생
//        car0ne.modelName = "싼타페"; // 객체의 필드값 변경
        car0ne.setModelName("싼타페"); // 필드값을 변경하는 Setter 메소드 호출


        System.out.println("첫번째 자동차 모델명 = " + car0ne.modelName); // 객체의 필드값 사용
        System.out.println("첫번째 자동차 엔진상태 = " + car0ne.engineStatus);
        System.out.println("첫번째 자동차 현재속도 = " + car0ne.currentSpeed);

        System.out.println("-------------------------------------------------------");
//        carTwo.modelName = "쏘나타";
//        carTwo.engineStatus = true; // 메소드 호출해서 함
//        carTwo.currentSpeed = 80; // 메소드 호출해서 함

        System.out.println("두번째 자동차 모델명 = " + carTwo.modelName); // 객체의 필드값 사용
        System.out.println("두번째 자동차 엔진상태 = " + carTwo.engineStatus);
        System.out.println("두번째 자동차 현재속도 = " + carTwo.currentSpeed);

        carTwo.setModelName("쏘나타");
        carTwo.setEngineStatus(true);
        carTwo.setCurrentSpeed(80);

        System.out.println("-------------------------------------------------------");
        // 참조변수, 메소드명 (값, 값...) - 참조변수에 저장된 객체가 . 연산자를 사용하여 메소드 호출
        car0ne.startEngine(); // 시동켜짐
        car0ne.speedUp(50);
        car0ne.speedUp(30);
        car0ne.speedDown(40);
        car0ne.speedZero();
        car0ne.stopEngine(); // 시동끔
    }
}

carOne = oop.Car@1a407d53
carTwo = oop.Car@3d8c7aca
carThree = oop.Car@5ebec15
-------------------------------------------------------
첫번째 자동차 모델명 = null
첫번째 자동차 엔진상태 = false
첫번째 자동차 현재속도 = 0
-------------------------------------------------------
두번째 자동차 모델명 = null
두번째 자동차 엔진상태 = false
두번째 자동차 현재속도 = 0
-------------------------------------------------------
null의 자동차 시동을 켰습니다.
null의 속도가50km/h 증가 되었습니다. 현재 속도는 50Km/h 입니다.
null의 속도가30km/h 증가 되었습니다. 현재 속도는 80Km/h 입니다.
null의 자동차 속도가 40km/h 감소 되었습니다.현재 속도는 40km/h 입니다.
null의 자동차가 멈췄습니다.
null의 자동차 시동을 껐습니다.

 

 


Overload

package oop;

public class Overload {
    public void displayInt(int param) {
        System.out.println("정수값 = " + param);
    }

    public void displayBoolean(boolean param) {
        System.out.println("논리값 = " + param);
    }

    public void displayString (String param) {
        System.out.println("문자열 = " + param);
    }
    
    // 메소드 오버로딩 (Metod OverLoading) : 클래스에서 동일한 기능을 제공하는 메소드가 매개변수에 의해 여러개 선언 해야하할 경우
    // 매개변수에 의해 여러개 선언해야할 경우 메소드의 이름을 같도록 선언하는 기능
    // > 매개변수의 자료형 또는 갯수 가 같지 않도록 선언
    // > 접근제한자와 반환형은 오버로드 선언과 무관

    public void display (int param) {
        System.out.println("정수값 = " + param);
    }

//    public void display (int param / 매개변수) {
//        System.out.println("정수값 = " + param);
//    } // 매개변수가 같아서 오류남

    public void display (boolean param) { // 메소드이름이 같더라도, 매개변수가 달라서 오류안남 >> 매개변수는 같아도되는데, 자료형 또는 갯수가 달라야함
        System.out.println("논리값 = " + param);
    }

    public void display (String param) {
        System.out.println("문자열 값 = " + param);
    }

}

 


OverloadApp

package oop;

public class OverloadApp {
    public static void main(String[] args) {
        Overload overload = new Overload();

        overload.displayInt(100);
//        overload.displayInt(false); 매개변수값이 맞지않으면 오류남.
        overload.displayBoolean(false);
        overload.displayString("홍길동");

        System.out.println("-----------------------------------------------");

        // 오버로드 선언된 메소드는 매개변수에 전닫ㄹ되는 값에 따라 메소드를 선택하여 호출
        // > 메소드 오버로드에 의한 다형성
        // 다형성 (Polymorphism) - 같은 이름의 메소드를 호출할 경우 상태에 메소드를 선택 호출
        // 되는 기능 > 메소드 오버로드, 메소드 오버라이드

        overload.display(200);
        overload.display(true);
        overload.display("임꺽정");
        // overload.display (12.34); // 전달받은 값에대한 자료형의 매겨변수가 없는 경우 에러 발생

    }
}

정수값 = 100
논리값 = false
문자열 = 홍길동
-----------------------------------------------
정수값 = 200
논리값 = true
문자열 값 = 임꺽정

 


Member

 

// 회원정보(아이디, 이름, 이메일)를 저장하기 위한 클래스
// > VO (Value Object) 클래스 : 특정 대상의 값을 저장하기위한 객체를 생성하기 위한 클래스
public class Member {
    // 필드 선언 - 객체를 생성하면 객체의 필드에는 기본값이(숫자형 : 0, 논리형 : false, 참조형 : null) 초기값으로 자동 저장
    private String id;
    private String name;
    private String email;

    //생성자 선언 : 객체를 생성하기 위한 특별한 형태의 메소드
    // => 생성자를 선언하지 않으면 매개변수가 없는 기본 생성자 제공
    // => 생성자를 선언하면 매개변수가 없는 기본 생성자 미제공
    // => 객체 필드에 원하는 초기값이 저장된 객체를 생성하기 위한 생성자를 선언
    //형식) 접근제한자 클래스명(자료형 변수명, 자료형 변수명, ... ) { 명령; 명령; ... }
    // => 반환형을 작성하지 않고 생성자의 이름은 반드시 클래스 이름과 동일하게 작성
    // => 메소드 오버로드를 사용하여 생성자를 여러개 선언 가능
    // => 일반적으로 생성자에서는 필드에 필요한 초기값을 저장하기 위한 명령 작성 - 초기화 작업

    //매개변수가 없는 생성자 선언 - 기본 생성자(Default Constructor)
    // => 초기화 작업 미구현 - 객체 필드에 기본값이 초기값으로 저장
    // => 기본 생성자를 선언하지 않으면 상속시 문제가 발생할 수 있으므로 기본 생성자를 선언하는 것을 권장
    //이클립스를 사용하여 기본 생성자 선언 가능
    // => [Ctrl]+[Space] >> 나열된 목록 중 Constructor 선택
    public Member() {
        // TODO Auto-generated constructor stub
    }

    // 매개변수가 있는 생성자 > 매개변수에 전달되어 저장된 값을 필드의 초기값으로 저장
    // 인텔리제이를 사용하여 매개변수가 있는 생성자 선언 가능
    // > [Alt]+[Insert] >>
    public Member(String id) {
        this.id = id;
    }

    public Member(String id, String name) {
        super();
        this.id = id;
        this.name = name;
    }

    public Member(String id, String name, String email) {
        super();
        this.id = id;
        this.name = name;
        this.email = email;
    }

    //메소드 선언
    public String getId() {
        return id;
    }


    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    //필드값을 확인하기 위해 필드값을 출력하는 메소드
    public void display() {
        System.out.println("아이디 = "+id);
        System.out.println("이름 = "+name);
        System.out.println("이메일 = "+email);
    }
}

 


MemberApp

public class MemberApp {
    public static void main(String[] args) {
        // new 연산자로 Member 클래스의 매개변수가 없는 기본 생성자를 호출하여 객체 생성
        // > 생성된 객체의 필드에는 기본값이 초기값으로 자동 저장
        Member member1 = new Member();

        // Getter 메소드를 호출하여 Member 객체의 필드값을 반환받아 출력
        System.out.println("아이디 = " + member1.getId());
        System.out.println("이름 = " + member1.getName());
        System.out.println("이메일 = " + member1.getEmail());

        System.out.println("------------------------------------");
        // Setter 메소드를 호출하여 Member 객체의 필드값 변경
        member1.setId("abc123");
        member1.setName("홍길동");
        member1.setEmail("abc@itwill.xyz");

        /*
        System.out.println("아이디 = " + member1.getId());
        System.out.println("이름 = " + member1.getName());
        System.out.println("이메일 = " + member1.getEmail());
        이거를 보기편하게 하기위해 mamber에 적음
         */

        member1.display();
        System.out.println("==============================================================");
        //new 연산자로 매개변수가 있는 생성자를 호출하여 객체 생성
        Member member2=new Member("def456");
        member2.display();
        System.out.println("==============================================================");
        Member member3=new Member("ghj789", "임꺽정");
        member3.display();
        System.out.println("==============================================================");
        Member member4=new Member("xyz258", "전우치", "xyz@itwill.xyz");
        member4.display();   
    }
}

아이디 = null
이름 = null
이메일 = null
------------------------------------
아이디 = abc123
이름 = 홍길동
이메일 = abc@itwill.xyz
==============================================================
아이디 = def456
이름 = null
이메일 = null
==============================================================
아이디 = ghj789
이름 = 임꺽정
이메일 = null
==============================================================
아이디 = xyz258
이름 = 전우치
이메일 = xyz@itwill.xyz