반응형
package chap06.sec04.exam01;

/**
 * packageName : chap06.sec04.exam01
 * fileName : Calculator
 * author : GGG
 * date : 2023-09-20
 * description : 모델 클래스
 *              함수(멤버 메소드)
 * 요약 :
 *          MVC 디자인 패턴 : M(Model), V(View), C(Controller)
 *          TODO : <요약>
 *              함수형태 :
 *              접근제어자 리턴자료형 함수명(매개변수1...., 매개변수 n) {실행문 ;}
 *              ex) public void sample(int a, String b, double c) { }
 *              접근제어자 : public(공용), default(생략, package 내에서는 사용가능) 등...
 *              함수이름 명명법 : 낙타표기법(카멜표기법), 첫 글자는 소문자, 단어 + 단어는 대문자
 *              매개변수 : 함수 실행시 전달되는 데이터
 *              리턴자료형 : 함수가 실행된 이후 결과값을 내보내기 할 떄 사용
 *              리턴값이 없는 함수 형태 호출: 객체변수.함수()
 *              리턴값이 있는 함수 형태 호출: 자료형 변수명 = 객체변수.함수()
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-20         GGG          최초 생성
 */
public class Calculator {
//      TODO: 속성(필드), 생성자함수, 함수(메소드)
//    속성생략 : 사물이나 사람의 특징을 나타냄
//    생성자생략 :
//    TODO: 함수 : 사물이나 사람의 동작을(행동) 나타냄

    /**
     * 전원 켜는 함수 : 리턴값 없이 만들기 : void 예약어 사용
     * 사용법 : 접근제어자 리턴자료형 함수명(매개변수1, ... 매개변수 n){};
     * 접근제어자 : public(공용 *), private(개인 *), default(생략), protected
     */

    void powerOn(){
        System.out.println("전원을 켭니다.");
    }

    void powerOff(){
        System.out.println("전원을 끕니다.");
    }

    /**
     * 더하기 함수 : 리턴값이 있는 함수
     */
    int plus(int x, int y){
        int result = x + y;
        return result;      // 결과 내보내기의 자료형이(정수:int)
    }

    /**
     * 나누기 함수
     */
    double divide(int x, int y){
        double result = (double) x / y;
        return result;
    }

}
package chap06.sec04.exam01;

/**
 * packageName : chap06.sec04.exam01
 * fileName : CalculatorApplication
 * author : GGG
 * date : 2023-09-20
 * description :    실행 클래스
 * 요약 :
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-20         GGG          최초 생성
 */
public class CalculatorApplication {
    public static void main(String[] args) {
        Calculator calculator = new Calculator();
//        TODO: 1) 전원을 on
        calculator.powerOn();

//        TODO: 2) 덧셈계산
//              리턴값이 있는 함수를 사용하는 전용 패턴(형태)
        int result = calculator.plus(5,6);
        System.out.println(result);

//        TODO: 예제 3) 계산기에 나눗셈 기능을 추가하려고 합니다.
//                      나눗셈을 추가하고 결과를 실행하세요

        double result2 = calculator.divide(10, 4);
        System.out.println(result2);

//        TODO : 예제 4) 추가 기능을 요청해서 추가했습니다.
//                      계산기를 끄는 기능을 추가해주세요.
        calculator.powerOff();
    }
}

 

package chap06.sec04.exam02;

/**
 * packageName : chap06.sec04.exam02
 * fileName : Computer
 * author : GGG
 * date : 2023-09-20
 * description :   컴퓨터모델 클래스
 * 요약 :
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-20         GGG          최초 생성
 */
public class Computer {
//    TODO: 속성, 생성자함수, 함수(메소드)
//    속성생략
//    생성자함수 생략
//    TODO: 함수
//          배열을 함수의 매개변수로 사용하면 장점이 있음
//          실행시에 함수의 매개변수로 1개를 넣을지, 2개를 넣을지 정해지지 않았을 때

    int sum1(int[] value) {
        int sum = 0;
//        매개변수 배열의 개수까지 모두 더하는 로직
        for (int i = 0; i < value.length; i++) {
            sum += value[i];     // 누적합
        }
        return sum;
    }

//    TODO: 기능추가 : 매개변수의 모든 값을 곱하는 함수를 만들어보세요

    int multi(int[] value) {
        int mul = 1;
        for (int i = 0; i < value.length; i++) {
            mul *= value[i];
        }
        return mul;
    }

    //    TODO: 자바의 새로운 기능 : ... 연산자
//          ...value : 매개변수의 각각의 변수를 배열로 만들어 줌
    int sum2(int... value) {
        int sum = 0;
//        매개변수 배열의 개수까지 모두 더하는 로직
        for (int i = 0; i < value.length; i++) {
            sum += value[i];     // 누적합
        }
        return sum;
    }

}
package chap06.sec04.exam02;

import java.util.ArrayList;
import java.util.List;

/**
 * packageName : chap06.sec04.exam02
 * fileName : ComputerApplication
 * author : GGG
 * date : 2023-09-20
 * description : 실행 클래스(main)
 * 요약 :
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-20         GGG          최초 생성
 */
public class ComputerApplication {
    public static void main(String[] args) {
        Computer computer = new Computer();

//       배열정의
        int[] value1 = {1, 2, 3};
        int result1 = computer.sum1(value1);
        System.out.println("result1 : "+ result1);


        int[] value2 = {1, 2, 3, 4, 5};
        int result2 = computer.sum1(value2);
        System.out.println("result2 : "+ result2);

//      TODO: 곱하기 함수 실행
        int[] value3 = {1,2,3};
        int result3 = computer.multi(value3);
        System.out.println("result3 : " + result3); // 6

//      TODO: 새로운 ...연산자 사용하기
        int result4 = computer.sum2(1, 2, 3);
        System.out.println(result4);

        int result5 = computer.sum2(1, 2, 3, 4, 5);
        System.out.println(result5);

    }

}
package chap06.sec04.exam03;

/**
 * packageName : chap06.sec04.exam03
 * fileName : Car
 * author : GGG
 * date : 2023-09-20
 * description : 자동차 모델 클래스
 * 요약 :
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-20         GGG          최초 생성
 */
public class Car {
    // gas 체크해서 차가 출발을 합니다.
    //    gas 있으면 "출발합니다" 출력하고,
    //    .run() 실행 // gas--; 감소시킴 반복문 종료
    //    다시 gas > 0 인지 확인해서 "gas를 주입할 필요가 없습니다"
    //     아니면 "gas"를 주입하세요"
    //    결과 :
    //      gas가 있습니다.
    //      출발합니다.
    //      달립니다.(gas잔량:5)
    //      달립니다.(gas잔량:4)
    //      달립니다.(gas잔량:3)
    //      달립니다.(gas잔량:2)
    //      달립니다.(gas잔량:1)
    //      멈춥니다.(gas잔량:0)
    //      gas가 없습니다.
    //      gas를 주입하세요.

    int gas;    // 연료

//    속성에 값을 넣지 않고, 1) 생성자를 이용해서 값을 넣거나
//                       2) setter 함수를 이용해서 값을 수정하거나
//    사용법 : void set속성명(int 속성명){ this.속성명 = 속성명; }
//    역할 : 속성에 값을 저장, 수정하는 함수
//    자동화 기능 : alt + insert

    public void setGas(int gas) {
        this.gas = gas;
    }

    /**
     * gas가 남았는지 확인하는 함수
     */
    boolean isLeftGas(){
        if(gas == 0){
            System.out.println("gas가 없습니다.");
            return false;
        } else{
            System.out.println("gas가 있습니다.");
            return true;
        }
    }

    /**
     * 자동차를 달리게 하는 함수 : gas 가 1씩 감소함
     * 계속 달리다가 gas == 0 순간 중단
     */
    void run(){
        while (true){
            if( gas > 0){
                System.out.println("달립니다. (gas잔량 :" + gas + ")");
                gas = gas - 1;
            } else {
                System.out.println("멈춥니다. (gas잔량 :" + gas + ")");
                return; // break 동일한 효과(강제중단)
            }
        }
    }
}
package chap06.sec04.exam03;


/**
 * packageName : chap06.sec04.exam03
 * fileName : CarApplication
 * author : GGG
 * date : 2023-09-20
 * description :
 * 요약 :
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-20         GGG          최초 생성
 */
public class CarApplication {
    public static void main(String[] args) {
//        객체 생성
        Car car = new Car();

//        TODO: 1) 기름 넣기 : 5
        car.setGas(5);

//        TODO: 2) 남아있는 기름 확인 : true, 없으면 false
        boolean gasState = car.isLeftGas();

//        TODO: 3) 자동차 출발
        if (gasState){
            System.out.println("출발합니다.");
            car.run();  // 출발
        }

//        TODO: 4) 기름 확인
        if(car.isLeftGas() == true){
            System.out.println("gas 넣을 필요가 없습니다.");
        } else {
            System.out.println("gas를 주입하세요");
        }
    }
}
package chap06.sec04.exam04;

/**
 * packageName : chap06.sec04.exam04
 * fileName : Calculator
 * author : GGG
 * date : 2023-09-20
 * description : 계산기 모델 클래스 (덧셈, 평균)
 * 요약 :
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-20         GGG          최초 생성
 */
public class Calculator {
    // TODO : 속성, 생성자함수, 함수(메소드)
    // 속성생략
    // 생성자 생략

    // TODO: 함수 : 덧셈, 평균, 계산실행
    // 사용법 : 접근제한자 리턴자료형 함수명(매개변수....){}

    /**
     * 덧셈 함수
     * @param x
     * @param y
     * @return
     */
    int plus(int x, int y){
        int result = x + y;
        return result;
    }

    /**
     * 평균 구하는 함수
     * @param x
     * @param y
     * @return
     */
    double avg(int x, int y){
//        TODO : 자신의 클래스 내에서는 자유롭게 함수를 사용할 수 있음
        int sum = plus(x, y);   // 합계
        double result = (double) sum / 2;
        return result;
    }

    /**
     * 자신의 계산결과를 출력하는 함수
     */
    void println(String message){
        System.out.println("계산 결과 : " + message);
    }

    /**
     * 평균과 계산결과를 출력하는 실행 함수
     */
    void execute(){
        // 1) 평균 함수
        double result = avg(7, 10);
        println(result + "");
    }



}
package chap06.sec04.exam04;

/**
 * packageName : chap06.sec04.exam04
 * fileName : CalculatorApplication
 * author : GGG
 * date : 2023-09-20
 * description : 실행클래스
 * 요약 :
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-20         GGG          최초 생성
 */
public class CalculatorApplication {
    public static void main(String[] args) {
        Calculator calculator = new Calculator();
        calculator.execute();   // 실행함수
    }
}
package chap06.sec04.exam05;

/**
 * packageName : chap06.sec04.exam05
 * fileName : Car
 * author : GGG
 * date : 2023-09-20
 * description :
 * 요약 :
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-20         GGG          최초 생성
 */
public class Car {
    //    TODO: 속성, 생성자함수, 함수(메소드)
    int speed;   // 자동차 속도

    /**
     * 현재 속성의 값을 구하는 함수 : getter 함수
     * 사용법: 리턴자료형 get속성명(){ return 속성명; }
     */
//    자동화 기능 : alt + insert => getter 선택
    public int getSpeed() {
        return speed;
    }

    /**
     * 키를 돌립니다. 출력 함수
     */
    void keyTurnOn() {
//        결과 출력 : sout
        System.out.println("키를 돌립니다.");
    }

    /**
     * 달립니다. 5개 출력 + 속도 함수
     */
    void run() {
//        반복문 5번 실행 : 10씩 증가
        for (int i = 10; i <=50 ; i=i+10) {
//            속성 = 10씩 증가
            speed = i;
            System.out.println("달립니다.(시속:" + speed + "km/h)");
        }
    }
}
package chap06.sec04.exam05;

/**
 * packageName : chap06.sec04.exam05
 * fileName : CarApplication
 * author : GGG
 * date : 2023-09-20
 * description : 실행 클래스
 * 요약 :
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-20         GGG          최초 생성
 */
public class CarApplication {
    public static void main(String[] args) {
        Car car = new Car();
        car.keyTurnOn(); // 키를 돌립니다. 출력
        car.run(); // 5개의 달립니다.
        int speed = car.getSpeed(); // 현재 속도 값을 리턴
        System.out.println("현재속도:" + speed + "km/h");



    }
}
package chap06.sec04.exam06;

/**
 * packageName : chap06.sec04.exam06
 * fileName : Calculator
 * author : GGG
 * date : 2023-09-20
 * description : 계산기 모델
 * 요약 :
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-20         GGG          최초 생성
 */
public class Calculator {
//    TODO: 속성, 생성자함수, 함수
    //함수
    /**
     * 정사각형 넓이 구하는 함수 : areaRectangle(10)
     * 사용법: 접근제한자 리턴자료형
     */
    double areaRectangle(double width) {
        return width * width;
    }

    /**
     * 직사각형 넓이 구하는 함수 : areaRectangle(10, 20)
     */
    double areaRectangle(double width, double height) {
        return width * height;
    }

}
package chap06.sec04.exam06;

/**
 * packageName : chap06.sec04.exam06
 * fileName : CalculatorApplication
 * author : GGG
 * date : 2023-09-20
 * description : 실행 클래스
 * 요약 :
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-20         GGG          최초 생성
 */
public class CalculatorApplication {
    public static void main(String[] args) {
        Calculator calculator = new Calculator();

//        함수의 오버로딩을 이용한 예제
//        정사각형의 넓이 구하기(한변의 길이(가로) * 한변의 길이(가로))
        double result1 = calculator.areaRectangle(10);

//        직사각형 넓이 구하기(가로 * 세로)
        double result2 = calculator.areaRectangle(10, 20);

//        결과 출력
        System.out.println("정사각형 넓이 :" + result1);
        System.out.println("직사각형 넓이 :" + result2);
    }
}
반응형

'Java > Java 이론' 카테고리의 다른 글

객체의 동등비교  (1) 2023.09.25
자료구조  (0) 2023.09.25
생성자  (0) 2023.09.20
생성자 함수  (0) 2023.09.20
클래스  (0) 2023.09.20
반응형
package chap06.sec03.exam02;

/**
 * packageName : chap06.sec03.exam02
 * fileName : Korean
 * author : GGG
 * date : 2023-09-20
 * description : 한국인 클래스
 * 요약 :
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-20         GGG          최초 생성
 */
public class Korean {
//    TODO: 속성, 생성자함수, 메소드
//    속성
    String name;        //  이름
    String ssn;         //  주민번호
//    생성자 함수
    Korean(){};

    Korean(String strName, String strSsn){
        name = strName;
        ssn = strSsn;
    };
}
package chap06.sec03.exam02;

/**
 * packageName : chap06.sec03.exam02
 * fileName : KoreanApplication
 * author : GGG
 * date : 2023-09-20
 * description : 실행 클래스
 * 요약 :
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-20         GGG          최초 생성
 */
public class KoreanApplication {
    /**
     * 한국인 객체를 생성하고 매개변수 2개짜리 생성자를 이용해서 속성을 초기화하세요.
     * 초기화 한 결과를 출력하세요.
     * //        결과 :
     * //            k1.name : 박자바 (문자열)
     * //            k1.ssn : 011225-1234567 (문자열)
     * //            k2.name : 김자바
     * //            k2.ssn : 930525-0654321
     */
    public static void main(String[] args) {

        Korean k1 = new Korean("박자바", "011225-1234567");
        Korean k2 = new Korean("김자바", "930525-0654321");

        System.out.println("k1.name " + k1.name);
        System.out.println("k1.ssn " + k1.ssn);
        System.out.println("k2.name " + k2.name);
        System.out.println("k2.ssn " + k2.ssn);

    }
}

생성자 오버로딩

package chap06.sec03.exam03;

/**
 * packageName : chap06.sec03.exam03
 * fileName : Car
 * author : GGG
 * date : 2023-09-20
 * description :    생성자 오버로딩
 * 요약 :
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-20         GGG          최초 생성
 */
public class Car {
//    TODO: 객체의 3요소 = 속성, 생성자, 함수
//    속성
    String company = "현대자동차";     // 제조사
    String model;                    // 자동차 모델(SUV, 세단)
    String color;                    // 자동차 색깔
    int maxSpeed;                    // 최고속도

//    기본 생성자
    public Car(){};

//    매개변수 1개짜리 생성자
    public Car(String model){
//        TODO: this? : 객체 자기 자신을 의미하는 객체변수
//             객체의 사용 : 객체변수.속성명
        this.model = model;
    }

//    매개변수 2개짜리 생성자
    public Car(String model, String color ){
        this.model = model;
        this.color = color;
    }

//    매개변수 3개짜리 생성자
//    자동화 기능이용 : alt + insert => 생성자 속성 선택 후 확인
    public Car(String model, String color, int maxSpeed) {
        this.model = model;
        this.color = color;
        this.maxSpeed = maxSpeed;
    }
}
package chap06.sec03.exam03;

/**
 * packageName : chap06.sec03.exam03
 * fileName : CarApplication
 * author : GGG
 * date : 2023-09-20
 * description :    실행 클래스
 * 요약 :
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-20         GGG          최초 생성
 */
public class CarApplication {
    public static void main(String[] args) {
//        객체 생성 : 모든 생성자 이용하기
        Car car1 = new Car();       // 기본 생성자
        Car car2 = new Car("자가용");      // 매개변수 1개
        Car car3 = new Car("자가용", "빨강");        // 매개변수 2개
        Car car4 = new Car("자가용","빨강",200);     // 매개변수 3개

//        결과출력
        System.out.println(car1.color);
        System.out.println(car1.company);
        System.out.println(car1.maxSpeed);
        System.out.println(car1.model);
        System.out.println("--------------------------------");
        System.out.println(car4.color);
        System.out.println(car4.company);
        System.out.println(car4.maxSpeed);
        System.out.println(car4.model);
    }
}

연습문제

/**
* Member 객체를 생성하고 싶습니다. 생성자에서 name 속성과 id 속성을
* 초기화 할 수 있도록 Member 클래스를 작성해 보세요.
*/
package chap06.sec03.verify.exam02;

/**
 * packageName : chap06.sec03.verify.exam02
 * fileName : Member
 * author : GGG
 * date : 2023-09-20
 * description : 회원 클래스
 * 요약 :
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-20         GGG          최초 생성
 */
public class Member {

    String name;
    String id;

    public Member(String name, String id) {
        this.name = name;
        this.id = id;
    }
}
package chap06.sec03.verify.exam02;

/**
 * packageName : chap06.sec03.verify.exam02
 * fileName : MemberApplication
 * author : GGG
 * date : 2023-09-20
 * description : 실행 클래스(main)
 * 요약 :
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-20         GGG          최초 생성
 */
public class MemberApplication {
    /**
     * Member 객체를 생성하고 싶습니다. 생성자에서 name 속성과 id 속성을
     *        초기화 할 수 있도록 Member 클래스를 작성해 보세요.
     * @param args
     */
    public static void main(String[] args) {
        Member member = new Member("홍길동", "hong");

        System.out.println("name :" + member.name);
        System.out.println("id :" + member.id);
    }
}
아래 메인 함수을 참고하여 오류를 수정할 클래스를 생성해보세요
package chap06.sec03.verify.exam03;

/**
 * packageName : chap06.sec03.verify.exam03
 * fileName : BoardApplication
 * author : GGG
 * date : 2023-09-20
 * description :
 * 요약 :
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-20         GGG          최초 생성
 */
public class BoardApplication {
    public static void main(String[] args) {
        Board board = new Board("제목");
        Board board2 = new Board("제목", "내용");
        Board board3 = new Board("제목", "내용", "작가");

        System.out.println("title :" + board.title);

        System.out.println("title2 :" + board2.title);
        System.out.println("content2 :" + board2.content);

        System.out.println("title3 :" + board3.title);
        System.out.println("content3 :" + board3.content);
        System.out.println("content3 :" + board3.writer);
    }
}
package chap06.sec03.verify.exam03;

/**
 * packageName : chap06.sec03.verify.exam03
 * fileName : Board
 * author : GGG
 * date : 2023-09-20
 * description : 모델 클래스
 * 요약 :
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-20         GGG          최초 생성
 */
public class Board {

    String title;
    String content;
    String writer;

    public Board(String title) {
        this.title = title;
    }

    public Board(String title, String content) {
        this.title = title;
        this.content = content;
    }

    public Board(String title, String content, String writer) {
        this.title = title;
        this.content = content;
        this.writer = writer;
    }
}
반응형

'Java > Java 이론' 카테고리의 다른 글

자료구조  (0) 2023.09.25
MVC 디자인 패턴  (0) 2023.09.22
생성자 함수  (0) 2023.09.20
클래스  (0) 2023.09.20
[JAVA 다시보기] 자바기초  (1) 2023.09.19
반응형

기본생성자

클래스 선언(정의)시 컴파일러에 의해 자동으로 추가되는 생성자
// 기본 생성자 : 만들지 않아도 컴파일러가 자동으로 1개 생성함(생략가능)
// 1) 생성자함수 이름은 클래스명과 같음
// 2) 생성자함수는 여러개를 만들수 있음 : 생성자 오버로딩(Overloading)
// 사용법 : 클래스명(){};
package chap06.sec03.exam01;

/**
 * packageName : chap06.sec03.exam01
 * fileName : Car
 * author : GGG
 * date : 2023-09-20
 * description :    생성자 함수
 * 요약 :
 *           자바소스(.java) -> 컴파일러(컴파일) => (.class) -> 실행
 *          기본 생성자 : 생성자가 한개도 없을 경우 클래스 선언(정의)시 컴파일러에 의해 자동으로 추가되는 생성자
 *          (만약에 있을 경우(2nd 생성자 등) 자동 추가되지 않음)
 *          오버로딩 : 함수의 이름이 같은 경우라도 에러를 발생시키지 않고 정의하게 하는 기능
 *               (주로 함수의 이름이 같고, 매개변수 자료형, 개수, 순서가 다른 경우에 오버로딩이 됨)
 *
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-20         GGG          최초 생성
 */
public class Car {
//    TODO: 클래스의 3요소 = 속성(필드), 생성자함수, 함수(메소드)
    String col;         // 자동차 색깔
    int ccNum;          // 자동차 배기량
//    TODO: 생성자 함수
//    기본 생성자 : 만들지 않아도 컴파일러가 자동으로 1개 생성함(생략가능)
//    1) 생성자함수 이름은 클래스명과 같음
//    2) 생성자함수는 여러개를 만들수 있음 : 생성자 오버로딩(Overloading)
//    사용법 : 클래스명(){};
    Car(){};

//    TODO: 2nd 생성자 함수 : 개발자가 정의하기 나름(매개변수 있고 자유롭게 정의할 수 있음)
//        **) 생성자 오버로딩 : 같은 이름을 가진 함수를 여러 개 정의할 수 있게 하는 기능(객체지향 언어만 가능)
    Car(String color, int cc){
//        TODO: 생성자 함수의 역할 : 속성의 초기화(변수에 값을 처음 넣어두는 행위)를 담당
      col = color;
      ccNum = cc;
    };
}

생성자 오버로딩

같은 이름을 가진 함수를 여러 개 정의할 수 있게 하는 기능(객체지향 언어만 가능)
package chap06.sec03.exam01;

/**
 * packageName : chap06.sec03.exam01
 * fileName : CarApplication
 * author : GGG
 * date : 2023-09-20
 * description :
 * 요약 :
 *
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-20         GGG          최초 생성
 */
public class CarApplication {
    public static void main(String[] args) {
//        객체 생성
//        사용법 : 클래스명 객체변수명 = new 생성자함수();
        Car car = new Car();                           // 기본 생성자 함수
//        2nd 생성자 함수 : Car(String color, int cc)
        Car car1 = new Car("검정", 3000);       // 오버로딩된 생성자 함수
        Car car2 = new Car("흰색", 2000);       // 오버로딩된 생성자 함수

//        결과출력 : 1st car1
        System.out.println(car1.ccNum);
        System.out.println(car1.col);
//        결과출력 : 2nd car2
        System.out.println(car2.ccNum);
        System.out.println(car2.col);
    }
}
반응형

'Java > Java 이론' 카테고리의 다른 글

MVC 디자인 패턴  (0) 2023.09.22
생성자  (0) 2023.09.20
클래스  (0) 2023.09.20
[JAVA 다시보기] 자바기초  (1) 2023.09.19
문자열 자료형  (1) 2023.09.08
반응형

클래스


* 클래스 : 객체의 구조를 정의하는 곳 (속성(필드, 멤버변수), 생성자, 함수(메서드))
* 객체(인스턴스) : 클래스로부터 생성되며 new 생성자함수() 이용해서 생성함
* new 연산자 : 객체 생성 연산자이며, 생성자함수를 호출하고, 힙 메모리 영역에 객체를 저장함
* 사용법 : 클래스 객체변수 = new 생성자함수();* 객체변수 : 힙 메모리 주소(방번호)가 저장됨
package chap06.sec02.exam01;

/**
 * packageName : chap06.sec02.exam01
 * fileName : Car
 * author : GGG
 * date : 2023-09-19
 * description :  자동차 클래스
 * 요약 :
 *      클래스         : 객체의 구조를 정의하는 곳 (속성(필드, 멤버변수), 생성자, 함수(메서드))
 *      객체(인스턴스)  : 클래스로부터 생성되며 new 생성자함수() 이용해서 생성함
 *      new 연산자     : 객체 생성 연산자이며, 생성자함수를 호출하고, 힙 메모리 영역에 객체를 저장함
 *      사용법         : 클래스 객체변수 = new 생성자함수();
 *      객체변수       : 힙 메모리 주소(방번호)가 저장됨
 *
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-19         GGG          최초 생성
 */
public class Car {
//    클래스의 3요소 : 속성, 생성자함수, 함수(메서드)
//    TODO: 속성(필드, 멤버변수)
    String compnay = "현대자동차";
    String model = "그랜저";
    String color = "검정";
    int maxSpeed = 350;
    int speed;      // 기본 초기화(0)
}
package chap06.sec02.exam01;

/**
 * packageName : chap06.sec02.exam01
 * fileName : CarApplication
 * author : GGG
 * date : 2023-09-19
 * description : 실행 클래스
 * 요약 :
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-19         GGG          최초 생성
 */
public class CarApplication {
    public static void main(String[] args) {

//        객체 생성 : 클래스명 객체변수명 = new 생성자함수();
//        생성자 함수명 == 클래스명
        Car car = new Car();
//        TODO: 클래스의 속성 출력하기
//              사용법 : 객체변수명.속성명

        System.out.println("제작회사 : "+ car.compnay);
        System.out.println("모델명 : "+ car.model);
        System.out.println("색상 : "+ car.color);
        System.out.println("최고속도 : "+ car.maxSpeed);
        System.out.println("현재속도 : "+ car.speed);       // 기본값 출력


//        car 클래스 속성값 수정 수정
//        현재속도를 수정해보기 (car.speed)
        car.speed = 60;
//        결과출력
        System.out.println("수정된 현재속도 : "+ car.speed);

    }


}

자동 속성 초기화

속성을 선언만 하고 출력할 때 기본값이 무엇인지 알아봅시다.
package chap06.sec02.exam02;

/**
 * packageName : chap06.sec02.exam02
 * fileName : FieldInit
 * author : GGG
 * date : 2023-09-20
 * description :    자동 속성 초기화
 * 요약 :
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-20         GGG          최초 생성
 */
public class FieldInit {
//    TODO: 클래스의 3요소 = 속성(필드), 생성자함수, 함수(메서드)
//    정수 : byte, short, int, long
    byte bField;
    short sField;
    int iField;
    long lField;

//    실수 : float, double
    float fField;
    double dField;

//    char / boolean
    char cField;
    boolean boField;

//    String / int[]
    String strField;
    int[] arrField;




}
package chap06.sec02.exam02;

/**
 * packageName : chap06.sec02.exam02
 * fileName : FiledApplication
 * author : GGG
 * date : 2023-09-20
 * description :
 * 요약 :
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-20         GGG          최초 생성
 */
public class FiledApplication {
    public static void main(String[] args) {
//        TODO: 클래스명 명명법 :  첫글자 대문자 나머지 소문자, 단어사이는 대문자(파스칼표기법)
        FieldInit fieldInit = new FieldInit();

//        정수
        System.out.println("byte : " + fieldInit.bField);
        System.out.println("short : " + fieldInit.sField);
        System.out.println("int : " + fieldInit.iField);
        System.out.println("long : " + fieldInit.lField);
//        실수
        System.out.println("float : " + fieldInit.fField);
        System.out.println("double : " + fieldInit.dField);
//        char / boolean
        System.out.println("char : " + fieldInit.cField);
        System.out.println("boolean : " + fieldInit.boField);
//        String / int[]
        System.out.println("String : " + fieldInit.strField);
        System.out.println("int[] : " + fieldInit.arrField);


    }
}

[ 출력 결과 ]

 

연습문제

/**
* Member 객체를 생성하고 속성에 아래의 값으로 저장한 후 속성의 값을 출력하세요
* 결과 :
* 이름 : 최하얀
* id : 23
*/
package chap06.sec02.verify;

/**
 * packageName : chap06.sec02.verify
 * fileName : Member
 * author : GGG
 * date : 2023-09-20
 * description :    회원 정보 클래스
 * 요약 :
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-20         GGG          최초 생성
 */
public class Member {
    String name;        // 회원명
    String id;          // 회원 아이디
    String password;    // 회원 패스워드
    int age;            // 나이


}
package chap06.sec02.verify;

/**
 * packageName : chap06.sec02.verify
 * fileName : MemberApplication
 * author : GGG
 * date : 2023-09-20
 * description :    실행클래스
 * 요약 :
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-20         GGG          최초 생성
 */
public class MemberApplication {
    public static void main(String[] args) {
        /**
         * Member 객체를 생성하고 속성에 아래의 값으로 저장한 후 속성의 값을 출력하세요
         * 결과 :
         *      이름 : 최하얀
         *      id  : 23
         */
        Member member = new Member();
        member.name = "최하얀";
        member.id = "23";
        System.out.println("이름 : " + member.name);
        System.out.println("id : " + member.id);

    }
}

반응형

'Java > Java 이론' 카테고리의 다른 글

생성자  (0) 2023.09.20
생성자 함수  (0) 2023.09.20
[JAVA 다시보기] 자바기초  (1) 2023.09.19
문자열 자료형  (1) 2023.09.08
[JAVA] 참조변수의 형변환  (0) 2023.08.11
반응형


HelloWorld 출력함수

public class Sec0101 {
    /**
     * Hello World 출력함수
     */
    public void exam01(){
        // 출력단축키 sout
        System.out.println("Hello World");
    }

    public void exam02(){
//        예제 1) x, y 정수 변수를 만들어서 덧셈결과를 화면에 출력하세요
        int x = 1;
        int y = 2;
        int result = x + y;
        System.out.println(result);
    }
}

변수

package chap02;

/**
 * packageName : chap02
 * fileName : Sec0201
 * author : GGG
 * date : 2023-09-18
 * description :
 * 요약 :
 *          변수          : 값을 저장할 수 있는 메모리 공간
 *          변수 사용 범위 : {} 안에서만 사용가능
 *                         만약에 {} 안에 {}가 있다면 변수는 안에 {} 도 사용가능함
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-18         GGG          최초 생성
 */
public class Sec0201 {
    public void exam01(){
//        변수 선언
        int value = 20;

//        변수 연산
//        예제 2) 변수 value에 값을 10 더하는 연산을 한 후 화면에 출력하세요
        int result = value + 10;

        System.out.println(result);
    }

    public void exam02(){
//        예제 3) x=3, y=5가 있습니다.
//        x와 y 값을 바꾸어서 출력하세요
//        swap 코딩
        int x = 3;
        int y = 5;
//        swap 코딩
        int temp = x; // x의 값을 임시변수에 넣어둠
        x = y;        // x의 값이 overwrite 됨
        y = temp;     // 임시변수 값을 y에 넣음
//        출력
        System.out.println("x = " + x +" , y = " + y);
    }

    /**
     * 변수의 허용범위 예제
     */
    public void exam04(){
        int v1 = 15;
        if(v1 > 10){
            int v2;
            v2 = v1 - 10;
        }
//        int v3 = v1 + v2 + 5; // v2는 변수 사용불가라서 에러 발생
    }
}

기본자료형

package chap02;

/**
 * packageName : chap02
 * fileName : Sec0202
 * author : GGG
 * date : 2023-09-18
 * description : 기본 자료형(Type)
 * 요약 :
 *         정수 : byte(1), short(2), int(4, ***), long(8, **)
 *         char : 2byte 자료형, 문자 1개를 의미, 홑따옴표('')표시
 *         (저장시 유니코드(숫자)로 저장되고 출력시는 문자로 출력됨)
 *         String(***) : 쌍따옴표("")로 감싼 문자열을 의미
 *         실수 : float(4), double(8, ***)
 *         boolean : 참/거짓 자료형, true/false
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-18         GGG          최초 생성
 */
public class Sec0202 {
    public void exam01(){
//        1bit : 최소 단위, 8bit = 1byte, 1024byte = 1KB
//        1024KB = 1MB, 1024MB = 1GB, 1024GB = 1TB, 1024TB = 1HB
//        2진수 표현 : 0b 를 붙이면 2진수(0, 1로 표현하는 수)
        int var1 = 0b1011; // 2진수(0b 붙이면 2진수)
        int var2 = 0206;   // 8진수(0 붙이면 8진수)
        int var3 = 365;    // 10진수
        int var4 = 0xB3;   // 16진수 (0x를 붙이면 16진수)

        System.out.println("var1 : " + var1);
        System.out.println("var2 : " + var2);
        System.out.println("var3 : " + var3);
        System.out.println("var4 : " + var4);

    }


    public void exam03(){
        long var1 = 10;     // 정수 8byte
        long var2 = 20L;    // L 붙이면 long 자료형

        System.out.println(var1);
        System.out.println(var2);
    }

    public void exam04(){
//        아스키코드
        char c1 = 'A';      // 문자를 직접 저장
        char c2 = 65;       // 십진수로 저장 => 'A'

        System.out.println(c1);
        System.out.println(c2);
    }

    public void exam05(){
        String name = "홍길동";
        String job = "프로그래머";

        System.out.println(name);
        System.out.println(job);

    }

    /**
     * 특수기호 : /n, /t, ", \(이스케이프문자)
     */
    public void exam06(){
        System.out.println("번호\t이름\t직업");                   // 탭 문자
        System.out.print("행 단위 출력\n");                       // 줄바꿈 문자
        System.out.println("우리는 \"개발자\" 입니다.");            // \" 사용
        System.out.println("봄\\여름\\가을\\겨울");                // \\ 사용
    }

    /**
     * 실수 : float(4), double(8, ***)
     */
     
    public void exam07(){
        float var2 = 3.14f;         // float 사용시 끝에 f 붙임
        double var3 = 3.14;         // double

        System.out.println(var2);
        System.out.println(var3);

//        e : 지수 표현식

        double var6 = 3e6;          // 3000000.0
        double var7 = 2e-3;         // 0.002

        System.out.println(var6);
        System.out.println(var7);
    }
}

형변환

package chap02;

/**
 * packageName : chap02
 * fileName : Sec0203
 * author : GGG
 * date : 2023-09-18
 * description : 자료형 변환
 * 요약 :
 *          자동 타입 변환 : 자동으로 자료형이 변환되는 것 : 작은(byte) 자료형 -> 큰 자료형
 *          강제 타입 변환 : 강제로 자료형 변환 : 사용법 : (자료형)변수명, 큰 자료형 -> 작은 자료형
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-18         GGG          최초 생성
 */

/**
 * 자동 형변환 예제
 */
public class Sec0203 {

    public void exam01(){
        byte byteValue = 10;    // 1byte 정수형
//        자동 자료형 변환
        int intValue = byteValue;
        System.out.println("intValue : " + intValue);

//        실수 자동 형변환
        float floatValue = 100.5F;
        double doubleValue = floatValue;
        System.out.println("doubleValue : " + doubleValue);
    }

    /**
     * 강제 형변환 예제
     * 참고) 아스키코드 변환 : char 변수 <- int 값 : 아스키코드 -> 문자로 변환
     *                      int 변수 <- char 값 : 아스키코드 변환 <- 문자
     */
    public void exam02(){
        int intValue = 44032;                // 4byte
//        char charValue = intValue;         // int 4byte, char 2byte 이므로 오류발생 강제형변환 필요
        char charValue = (char)intValue;     // 강제 형변환

//        TODO : char 자료형에 아스키 코드(숫자) 변환 : 아스키코드(숫자) -> 문자로 변환
        char alpha = 65;    // A
//        TODO : 정수형 자료형에 문자 -> 아스키코드로 변환
        int beta = 'A';     // 65


        System.out.println("charValue : " + charValue);

//        double(8) -> int(4) 강제 형변환
        double doubleValue = 3.14;
//        int intValue2 = doubleValue;      // 오류발생
        int intValue2 = (int)doubleValue;

        System.out.println("intValue : " + intValue2);
    }

    /**
     * 문자열 + 숫자 = 문자열
     */
    public void exam06(){
//        결합 연산
        String str1 = 10 + 2 + "8";     // 128
        System.out.println(str1);

        String str2 = 10 + "2" + 8;     // 1028
        System.out.println(str2);

        String str3 = "10" + (2 + 8);   // 1010
        System.out.println(str3);
    }

    /**
     *  문자열 -> int 자료형 변경 : Integer.parseInt("값");
     *  int -> 문자열 변경 :
     */
    public void exam07(){
        // 문자열 -> int 자료형으로 변경
        int value1 = Integer.parseInt("10");            // 문자열 -> 정수
        double value2 = Double.parseDouble("3.14");     // 문자열 -> 실수
        boolean value3 = Boolean.parseBoolean("true");  // 문자열 -> 참/거짓

        System.out.println(value1);
        System.out.println(value2);
        System.out.println(value3);

        // int -> 문자열 자료형으로 변경
        String str1 = String.valueOf(10);           // 정수 -> 문자열로 변경 (속도 빠름)
        String str2 = "" + 10;                         // 빈문자열 + 정수 = 문자열
        String str3 = String.valueOf(3.14);         // 실수 -> 문자열
        String str4 = String.valueOf(true);         // 참/거짓 -> 문자열

        System.out.println(str1);
        System.out.println(str2);
        System.out.println(str3);
        System.out.println(str4);
    }
}

입출력함수 및 문자열 비교함수

package chap02;

import java.util.Scanner;

/**
 * packageName : chap02
 * fileName : Sec0204
 * author : GGG
 * date : 2023-09-18
 * description :
 * 요약 :
 *          System.out.println() : 화면에 출력하고 줄바꿈 함수
 *          System.out.print() : 화면에 출력하는 함수
 *          System.out.printf("%d %s %f", 정수변수, 문자열변수, 실수변수)
 *          Scanner : 콘솔 입력을 받기 위한 클래스(객체 정의)
 *                    한라인 입력 받기 함수      : .nextLine();
 *                    공백까지 입력 받기 함수    : .next();
 *                    참고) nextInt(), nextDouble() 등...
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-18         GGG          최초 생성
 */
public class Sec0204 {

    public void exam05(){
//        입력받기 : System.in (키보드 입력)
        Scanner scanner = new Scanner(System.in);
        String inputData;   // 입력 문자열
        while(true){
            inputData = scanner.nextLine();     // 1 라인 입력받기
            System.out.println("입력된 문자열 :" + inputData);
//            TODO: 코드를 완성하세요 (입력된 문자열이 q가 들어오면 반복문 종료하게)
//            TODO: 자바에서 문자열 비교 equal 함수 사용
//                  문자열.equals("문자열2") : 같으면 true, 아니면 false
            if (inputData.equals("q")) {
                break;
            }
        }
        System.out.println("종료");

    }

}

연산자

package chap03;

import java.util.Scanner;

/**
 * packageName : chap03
 * fileName : Sec0301
 * author : GGG
 * date : 2023-09-18
 * description :
 * 요약 :
 *          산술 : +, -, *, /, %(나머지 연산자)
 *          부호 : +, -
 *          문자열 붙이기 : +
 *          대입연산자 : =, +=, -=, *=, /=, %=
 *          증감 : ++, --
 *          비교 : ==, !=, >, <, >=, <=,(1문자 비교, 숫자비교) instanaceof
 *          TODO : 문자열 비교 : 문자열.equals(문자열2)
 *          논리 : !, &, |,(비트연산자) &&(논리곱), ||(논리합)
 *          삼항 : (조건식)? A : B
 *          우선순위 필요하면 () 쓸 것
 *
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-18         GGG          최초 생성
 */
public class Sec0301 {
    public void exam01(){
        int x = -100;
        int result1 = +x;
        int result2 = -x;
        System.out.println("result1 : " + result1);
        System.out.println("result2 : " + result2);

    }

    public void exam03(){
        boolean play = true;
        System.out.println(play);
        play = !play;  // false
        System.out.println(play);
    }

    /**
     * 사칙연산 예제 : /(나눗셈) 조심
     */
    public void exam04(){
        int v1 = 5;
        int v2 = 2;

        int result = v1 + v2;
        System.out.println(result);
        System.out.println("---------------------------------");
        int result2 = v1 / v2;
        System.out.println(result2);    // 정수/정수 => 실수부분이 잘림
        System.out.println("---------------------------------");
        // TODO : 나눗셈 개선 코딩 : 강제 형변환 후 계산해야함
        double result3 = (double)v1 / (double)v2;
//        double result3 = (double)v1 / v2;     // 같은 결과
        System.out.println(result3);
    }

//    연습문제 : 정수 1개를 입력받아 그대로 출력하기
//    입력 : 5
    public void exam05(){
        Scanner sc = new Scanner(System.in);
        System.out.println(sc.next());
    }

//    연습문제2 : 문자 2개 입력받아 순서 바꿔 출력하기
    public void exam06(){
        Scanner sc = new Scanner(System.in);
        String strFirst = sc.next(); // 공백까지 입력받기
        String strSecond = sc.next(); // 공백까지 입력받기
        System.out.println(strSecond + " " + strFirst);
    }


    /**
     * char : 내부적으로 정수로 저장됨(유니코드 : 아스키코드 확장판(한글, 중국어 등을 표시))
     */
    public void exam07(){

        char c1 = 'A' + 1; // char(정수) : 'B' ('A' 아스키코드(65) 65 + 1 = 66)
        char c2 = 'A';
        System.out.println(c1);
        System.out.println(c2);
    }


    // 연습문제3 : char 이용하는 문제
    // 값이 'A' 로 주어져 있습니다. 'A' 대문자 이면 대문자이군요 라고 출력하고, 소문자이면 소문자이군요라고 출력, 숫자이면 숫자이군요 라고 출력

    public void exam08(){
        int charCode = 'A';
        if(charCode >= 65 && charCode <= 90) {
            System.out.println("대문자이군요");
        } else if (charCode >= 97 && charCode <= 122) {
            System.out.println("소문자이군요");

        } else if(charCode>=48 && charCode<=57) {
            System.out.println("숫자이군요");
        } else {
            System.out.println("다른 문자이군요");
        }
    }

    /**
     * 연습문제 : 정수 1개가 주어진다. 2와 3의 배수이면 2 또는 3의 배수이군요
     *          아니면, 2 또는 3의 배수가 아니군요
     */
    public void exam10(){
        int value = 6;

        if((value % 2 == 0) || (value % 3 == 0)){
            System.out.println("2 또는 3의 배수이군요");
        } else {
            System.out.println("2 또는 3의 배수가 아니군요");
        }
    }

}

if문과 switch문

package chap04;

/**
 * packageName : chap04
 * fileName : Sec0401
 * author : GGG
 * date : 2023-09-19
 * description : 조건문
 * 요약 :
 *          if문 - if(조건문1){실행문1} else if(조건문2){실행문2} else{실행문3};
 *          => 조건문1 true 실행문1 실행되고 조건문2 true 실행문2 실행되고 모두 아니면 실행문3 실행
 *          switch문 - switch(변수) { case 값1: 실행문1;break; case 값2: 실행문2;break;
 *                                     default: 실행문3;break;
 *          }
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-19         GGG          최초 생성
 */
public class Sec0401 {
    /**
     * 예제 1 : 초기값이 90이상이면 점수가 90보다 큽니다.
     *                          등급은 A입니다. 출력
     *                90이하이면 점수가 90보다 작습니다.
     *                         등급은 B입니다. 출력
     */
    public void exam01(){
        int score = 93;     // 초기값
        if(score >= 90){
            System.out.println("점수가 90보다 큽니다.");
            System.out.println("등급은 A입니다.");
        } else {
            System.out.println("점수가 90보다 작습니다.");
            System.out.println("등급은 B입니다.");
        }
    }

    /**
     * 자바 랜덤 함수 소개하는 예제
     * 랜덤 함수 : Math.random() : 0 ~ 1 사이의 숫자(실수)를 내보내기(retrun)
     * 1 ~ 10 까지의 정수를 뽑기
     * 가공 :
     *      1 <= x < 11 의 정수 뽑기로 변환
     *      1) 0.0 <= Math.random() < 1.0
     *      2) 0.0 * 10 <=  Math.random() * 10 < 1.0 * 10                       // 10 곱하기
     *      3) (int)0.0 * 10 <=  (int)Math.random() * 10 < (int)1.0 * 10        // 강제 형변환 : 실수 -> 정수
     *         => 0 <= (int)Math.random() * 10 < 10
     *      4) 0 + 1 <= (int)Math.random() * 10 + 1 < 10 + 1
     *        => 1 <= (int)Math.random() * 10 + 1 < 11
     */

    public void exam04(){
        // 예제 : 주사위를 던져서 나오는 숫자를 화면에 출력하세요
        // 단, 1 ~ 6 까지의 랜덤하게 나오는 것
        int num = (int)(Math.random() * 6) + 1;      // 1 ~ 10 => 1 ~ 6
//        조건문
        if(num == 1){
            System.out.println("1번");
        } else if(num == 2){
            System.out.println("2번");
        } else if(num == 3){
            System.out.println("3번");
        } else if(num == 4){
            System.out.println("4번");
        } else if(num == 5){
            System.out.println("5번");
        } else {
            System.out.println("6번");
        }
    }

    /**
     * switch 문을 이용해서 코딩하기
     * 예제 : 부장이면 "700만원" 출력, 과장이면 "500만원" 출력
     *       그외 "300만원" 출력
     */

    public void exam08(){
        String position = "과장";

        switch (position){
            case "부장":
                System.out.println("700만원");
                break;
            case "과장":
                System.out.println("500만원");
                break;
            default:
                System.out.println("300만원");
        }
    }
}

반복문 for

package chap04;

/**
 * packageName : chap04
 * fileName : Sec0402
 * author : GGG
 * date : 2023-09-19
 * description : 반복문
 * 요약 :
 *          for문 : for(초기화식; 조건식; 증감식) {반복문;}
 *          => 조건식이 true 일때만 반복문이 실행됨
 *          while문 : 초기화식;
 *                    while(조건식) {
 *                        반복문;
 *                        증감식;
 *                    }
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-19         GGG          최초 생성
 */
public class Sec0402 {

    /**
     * 예제1 : 1 ~ 10까지 숫자를 화면에 출력하세요
     */
    public void exam01() {
        // fori : for문 단축키
        for (int i = 1; i < 11; i++) {
            System.out.println(i);
        }
    }

    /**
     * 예제2 : 1 ~ 100 까지의 합
     */

    public void exam02() {
        int sum = 0;
        for (int i = 1; i <= 100; i++) {
            sum += i;
        }
        System.out.println("1~100 까지의 합 : " + sum);
    }

    /**
     * 예제 : 주사위 2 : 주사위를 던져서 나오는 숫자를 계속 화면에 출력하되 6이 나오면 반복문을 중단하고 빠져나오세요
     * 단, 빠져 나올때 프로그램 종료 라고 출력하세요
     */
    public void exam08() {

        while (true) {
            int num = (int) (Math.random() * 6) + 1;
            System.out.println(num);
            if (num == 6) {
                break;
            }
        }
        System.out.println("프로그램 종료");
    }

    /**
     * 예제 : 1 ~ 10 사이의 수 중에서 짝수만 출력하는 코드 : continue
     */
    public void exam09() {
        for (int i = 1; i <= 10; i++) {
            if (i % 2 != 0) continue;
            System.out.println(i);
        }
    }

    /**
     * (참고) 새로나온 사용법 : 반복문의 라벨
     * 활용 : 중첩 for문에서 주로 사용
     */
    public void exam10() {
        Outter:
        for (char upper = 'A'; upper <= 'Z'; upper++) {
            for (char lower = 'a'; lower <= 'z'; lower++) {
                System.out.println(upper + "-" +lower);      // 화면 출력
//                g 가 나오면(안쪽/바깥쪽 모두) 반복문 중단
                if(lower == 'g'){
                    break Outter;       // 이중 중첩 반복문 탈출
                }
            }
        }
        System.out.println("프로그램 종료");
    }
}

참조자료형과 참조변수

package chap05;

/**
 * packageName : chap05
 * fileName : Sec0501
 * author : GGG
 * date : 2023-09-19
 * description : 참조 자료형과 참조 변수
 * 요약 :
 *          기본 자료형 : int(4), long(8), float(4), double, boolean 자료형
 *          => 스택 메모리 영역에 그대로 저장됨
 *          참조 자료형 : String(문자열), 배열, 객체
 *          => 힙 메모리 영역에 값이 저장되고 , 스택 메모리 영역에 주소값이 저장됨
 *          JVM(Java Virtual Machine) : 자바 가상 머신 : jdk(자바가상머신)
 *          역할 : linux / windows(운영체제) 모든 곳에서 실행할 수 있게 만드는 프로그램
 *          비교연산자(==) : 기본자료형에서는 값을 비교하고,
 *                         참조자료형에서는 주소값을 비교하게 됨
 *                         (스택 메모리 영역의 저장된 값을 비교함)
 *          null 포인트 에러(예외) : 프로그램을 강제 비정상 중단함
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-19         GGG          최초 생성
 */
public class Sec0501 {
    /**
     * 비교연산자(==) 와 equals 함수 예제
     */
    public void stringEqualExam(){
//        참조 자료형
//        참조자료형 객체변수 = new 생성자함수();
//        메모리에 랜덤한 주소(방번호)값으로 생성됨
        String strVar1 = new String("신민철");
        String strVar2 = new String("신민철");

//        주소값(방번호)비교 : 개발자 입장에서는 의미 없음
        if(strVar1 == strVar2){
            System.out.println("두개의 주소가 같음");
        } else {
            System.out.println("두개의 주소가 다름");
        }
        
//        equals() 함수 사용 : 값을 비교하는 함수
        if(strVar1.equals(strVar2) == true){
            System.out.println("두개의 값이 같음");
        } else {
            System.out.println("두개의 값이 다름");
        }

//        null 포인터 예외(에러)
//        배열에서 null 에러
        int[] intArray = null;  // 없음(공간 없음)
        intArray[0] = 10;   // 0번지 방에 10번을 넣으니 null 에러가 발생

//        객체에서 null 에러
        String str = null;      // 권장코딩 : String str = "";  빈 문자열로 초기화
//        문자열의 길이를 가져오는 함수 : 문자열.length()
        System.out.println("총 문자 수는 : " + str.length());    // null 에러 발생
    }
}

배열

package chap05;

import java.util.Arrays;

/**
 * packageName : chap05
 * fileName : Sec0502
 * author : GGG
 * date : 2023-09-19
 * description : 배열
 * 요약 :
 *       배열 : 같은 자료형의 데이터를 연속된 공간에 나열하고 인덱스를 부여해 놓은 자료구조
 *       인덱스 : 배열 항목에 붙인 번호 , 0 ~ n 까지의 범위
 *       배열 선언(정의) : 자료형[] 변수;
 *       배열 생성 : 1) 자료형[] 변수 = {값1, ..., 값n};
 *                 2) 자료형[] 변수 = new 자료형[길이];
 *                 3) 자료형[] 변수 = new 자료형[길이] {값1, ... , 값n};
 *       배열 길이 : 배열의 값의 개수, 배열변수.lenght (읽기전용)
 *       다차원 배열 : 배열 안에 또 다른 배열이 있음
 *              자료형[][] 변수 = new 자료형[크기][크기];
 *              자료형[][] 변수 = {{값1...},{값1...}};
 *              => for문 코딩 (2개사용)
 *              => int[][] arr = {{1,2,3}, {4,5,6}}
 *              => 팁 ! : for(int i = 1; i<=2; i++){
 *                          for(int j = 1; j <=3; j++){
 *                       }
 *                      }
 *       향상된 for 문 : for(자료형 변수 : 배열) {} => 자동으로 인덱스 증가
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-19         GGG          최초 생성
 */
public class Sec0502 {
    /**
     * 예제 : 학생 10명의 성적을 저장하고 평균값 구하기
     */
    public void getStudent(){
//        배열의 초기값
        int[] score = {83, 84, 85, 86, 87, 88, 89, 90, 91, 92};
        int sum = 0;    // 합계 변수
        for (int i = 0; i < score.length ; i++) {
            sum += score[i];        // 배열의 값 모두 더하기(누적합)
        }
//        평균구하기
        double avg = (double)sum / 10; // 평균
        System.out.println("sum = " + sum + " , avg = " + avg);
    }

    /**
     * 예제 2 : 배열에서 함수의 매개변수로 전달시 주의점
     */

    public void arrayFunc(){

        int[] scores = {84, 91, 88};

        int sum2 = add(scores);     // ok 가능
//        이렇게 하면 안됨
//        int sum3 = add({84, 91, 88});   // 에러 발생
//        참고)
        int sum4 = add(new int[]{84, 91, 88});  // 가능

        System.out.println(sum2);
        System.out.println(sum4);
    }


    // 더하기 함수 생성해서 호출해서 쓰기
    public int add(int[] scores) {
        int sum = 0;
        for (int i = 0; i < 3; i++) {
            sum += scores[i];
        }
        return sum;
    }

    /**
     * 배열의 2번째 정의 방법
     */

    public void arrayTwo(){
        int[] arr1 = new int[3];    // 배열의 정의(선언) : 빈방을 만들기(메모리에)
//        정수 : 기본값(0), 문자열 : null, 실수 : 0.0 등
//        배열의 3가지 방에 값넣기
        arr1[0] = 10;
        arr1[1] = 20;
        arr1[2] = 30;
//        배열 출력
        for (int i = 0; i < 3; i++) {
            System.out.println(arr1[i]);    // 배열 값 출력
        }

//        TODO: 배열의 안에 값을 간단히 확인하기
//        참고
//        사용법 : Arrays.toString(배열변수)
        System.out.println(Arrays.toString(arr1));
    }

    /**
     * 얇은 복사(shallow copy) vs 깊은 복사(depp copy)
     */
    public void copyArray(){
//        TODO: 얇은 복사
        int[] oldArray = {1, 2, 3};
        int[] copyArray = oldArray;     // 얇은 복사(주소값)을 복사
        int[] newArray = new int[3];    // 깊은 복사용 변수
//        스택방         |                        힙
//        oldArray      | 100       <------>    100 : {1, 2, 3}
//        copyArray     | 100
//        TODO : 얇은 복사 특징 : oldArray 값을 변경하면 copyArray 값도 같이 변경됨
//             : copyArray 값을 변경해도 원본인 oldArray 도 변경됨

//        위의 현상을 피하고자 깊은 복사를 함
//        TODO : 깊은 복사 : 반복문 이용
        for (int i = 0; i < newArray.length ; i++) {
            newArray[i] = oldArray[i];      // 깊은 복사(원본값 바뀌어도 복사본이 바뀌지 않음)
        }


    }

    /**
     * 향상된 for문 : for(자료형 변수 : 배열) {반복문};
     * 아래 점수 총합을 출력하세요
     */
    public void AdvancedExam(){
        int[] scores = {95, 71, 84};        // 국영수 점수 배열
        int sum = 0;
        for (int s : scores) {
            sum += s;
        }
        double avg = (double)sum / scores.length;
        System.out.println("점수의 총합 : " + sum + ", 점수의 평균 : " + avg);

    }
}

열거형

package chap05;

import java.util.Calendar;

/**
 * packageName : chap05
 * fileName : Sec0503
 * author : GGG
 * date : 2023-09-19
 * description :    열거형 사용
 * 요약 :
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-19         GGG          최초 생성
 */
public class Sec0503 {
    /**
     * 열거형 사용 예제
     */
    public void EnumWeek(){
        Week today = null;
//        달력 객체 : Calendar
        Calendar calendar = Calendar.getInstance(); // 객체 가져오기
        int week = calendar.get(Calendar.DAY_OF_WEEK);  // 현재 요일(1 ~ 7 숫자)
//        조건식
        switch (week){
            case 1:
                today = Week.SUNDAY; break;
            case 2:
                today = Week.MONDAY; break;
            case 3:
                today = Week.TUESDAY; break;
            case 4:
                today = Week.WEDNESDAY; break;
            case 5:
                today = Week.THURSDAY; break;
            case 6:
                today = Week.FRIDAY; break;
            case 7:
                today = Week.SATURDAY; break;
        }
        System.out.println("오늘 요일 :" + today);
    }
}
package chap05;

/**
 * packageName : chap05
 * fileName : Week
 * author : GGG
 * date : 2023-09-19
 * description : 열거형 클래스
 * 요약 :
 *      열거 자료형 : 몇 가지로 제한된 상수를 가지는 자료형
 *      사용법(정의) : enum 변수명 { 상수1, 상수2, ... 상수n }
 *      클래스 내에서 사용
 *          변수명.상수명 ex) Week.MONDAY
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-19         GGG          최초 생성
 */
public enum Week {
    //    월,화,수,목,금,토,일 정의(상수)
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY,
    SUNDAY
}
package chap05;

import java.util.Arrays;

/**
 * packageName : chap05
 * fileName : Verify05
 * author : GGG
 * date : 2023-09-19
 * description :   배열 / 열거형 연습문제
 * 요약 :
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-19         GGG          최초 생성
 */
public class Verify05 {
    /**
     * 주어진 배열에서 최대값을 구해보세요
     */
    public void exam04() {
        int[] array = {1, 5, 3, 8, 2};
        int max = array[0];
        for (int i = 0; i < array.length; i++) {
            if (max < array[i]) {
                max = array[i];
            }
        }
        System.out.println(max);
    }

    /**
     * 2) 중첩 for문을 이용해서 주어진 배열의 전체 항목의 합과 평균을 구해보세요.
     */
    public void exam05() {
        int[][] array = { { 95, 86 }, { 83, 92, 96 }, { 78, 83, 93, 87, 88 } };

        int sum = 0;
        int count = 0;

        for(int i = 0; i < array.length; i++){
            for(int j = 0; j < array[i].length; j++){
                sum += array[i][j];
                count += 1;
            }
        }
        double avg = (double) sum / count;



        System.out.println(sum);
        System.out.println(avg);
    }

}
반응형

'Java > Java 이론' 카테고리의 다른 글

생성자 함수  (0) 2023.09.20
클래스  (0) 2023.09.20
문자열 자료형  (1) 2023.09.08
[JAVA] 참조변수의 형변환  (0) 2023.08.11
[JAVA] 인터페이스(interface)  (0) 2023.08.11
반응형
    // String : 문자열 자료형
    // 0 ~ 다수의 문자들로 구성됨
    // ""로 둘러쌈
    // String은 참조 자료형임

    // 리터럴 방식
    String str1 = "Hello Java!";
    String str2 = "반갑습니다. 주녘의 블로그입니다.";

    // 빈 문자열도 가능
    String str3 = "";

    // 인스턴스 생성 방식
    String str4 = new String("안녕, 나는 주녘이야");

    String hi1 = "Hi";
    String hi2 = "Hi";
    String jv = "Java";

    // 리터럴끼리는 == 사용하여 비교가 가능함
    boolean bool1 = hi1 == hi2;  	// true
    boolean bool2 = hi1 == jv;		// false

    String hi3 = new String("Hi");
    String hi4 = new String("Hi");
    String hi5 = hi4;

    // 인스턴스와 비교하려면 == 이 아닌 .equals 메소드를 사용

    boolean bool3 = hi3 == hi4;		// false
    // 같은 Hi 인데 왜 false로 나올까?
    // hi3와 hi4 메모리의 다른 주소값으로 인스턴스가 생성되었기 때문!
    int result = System.identityHashCode(hi3);		// 2074407503
    int result2 = System.identityHashCode(hi4);		// 999966131

    boolean bool4 = hi1.equals(hi2);		// true
    boolean bool5 = hi1.equals(hi3);		// true
    boolean bool6 = hi1.equals(hi4);		// true
    boolean bool7 = hi1.equals(hi2);		// true
    boolean bool8 = hi4 == hi5;			// true
}

 

반응형

'Java > Java 이론' 카테고리의 다른 글

클래스  (0) 2023.09.20
[JAVA 다시보기] 자바기초  (1) 2023.09.19
[JAVA] 참조변수의 형변환  (0) 2023.08.11
[JAVA] 인터페이스(interface)  (0) 2023.08.11
[JAVA] String 클래스  (0) 2023.08.10
반응형

기본형 변수처럼 참조변수도 형변환이 가능하다.

단, 서로 상속관계에 있는 클래스 사이에서만 가능!

자손타입의 참조변수를 조상타입의 참조변수로, 조상타입의 참조변수를 자손타입의 참조변수로의 형변환만 가능하다.

 


class Phone { }
class IPhone extends Phone { }
class AndroidPhone extends Phone { }

예를 들어 Phone클래스가 있고 이를 상속받는 IPhone과 AndroidPhone 클래스가 있을때,

  • IPhone타입의 참조변수 i는 조상타입인 Phone으로 형변환이 가능하다.
  • IPhone과 AndroidPhone은 상속관계가 아니기 때문에 형변환이 불가능하다.

IPhone i = new IPhone();

 

Phone p = (Phone)i; // ok. 조상인 Phone 타입으로 자동형변환(생략가능)

IPhone i2 = (IPhone)p; // ok. 자손인 IPhone 타입으로 형변환(생략불가)

//AndroidPhone a = (AndroidPhone)i; // no. 상속관계가 아닌 클래스 간에는 형변환 불가, IPhone과 AndroidPhone은 상속관계가 아님.

기본형의 형변환과 달리 참조형의 형변환은 변수에 저장된 값(주소값)이 변환되는 것이 아니다.

Phone p = (Phone)i; // i의 값(객체의 주소)을 p에 저장

                                // 타입을 일치시키기 위해 형변환 필요(생략가능함)

i = (IPhone)p; // 조상타입을 자손타입으로 형변환하는 경우 생략불가함

 

 

instanceof 연산자
: 참조변수가 참조하고 있는 인스턴스의 실제 타입을 알아보기 위해 사용하는 연산자
  • 주로 조건문에 사용
  • (참조변수) instanceof (타입(클래스명))
  • 연산의 결과로 boolean 값인 true와 false 중 하나를 반환함
  • 연산의 결과로 true를 얻었다면 참조변수가 검사한 타입으로 형변환이 가능하다는 뜻이다.
반응형

'Java > Java 이론' 카테고리의 다른 글

[JAVA 다시보기] 자바기초  (1) 2023.09.19
문자열 자료형  (1) 2023.09.08
[JAVA] 인터페이스(interface)  (0) 2023.08.11
[JAVA] String 클래스  (0) 2023.08.10
[JAVA] 추상 클래스와 메서드  (0) 2023.08.10
반응형
인터페이스
  • 일종의 추상클래스
  • 추상클래스처럼 추상메서드를 갖지만 추상클래스보다 추상화 정도가 높다
  • 추상클래스와 달리 몸통을 갖춘 일반 메서드 or 멤버변수를 구성원으로 가질 수 없다.
  • 오직 추상메서드와 상수만을 멤버로 가질 수 있으며, 그 외에 어떠한 요소도 허용하지 않는다.

추상클래스 = 부분적으로 완성된 미완성 설계도
인터페이스 = 구현된 것이 없는 밑그림만 그려져 있는 '기본 설계도'

 

 

인터페이스 작성해보기
  • 인터페이스를 작성하는 것은 클래스 작성하는 것과 같다.
  • 클래스는 class라는 키워드를 사용하지만 인터페이스는 interface라는 키워드를 사용한다.
  • interface는 접근제어자로 public 또는 default만 사용할 수 있다. 

interface 인터페이스이름 {
          public static final 타입 상수이름 = 값;
          public abstract 메서드이름(매개변수목록);
}

인터페이스 멤버들은 다음과 같은 제약사항이 있다.

  • 모든 멤버변수는 public static final 이어야 하고, 이를 생략할 수 있다.
  • 모든 메서드는 public abstract 이어야 하고, 이를 생략할 수 있다. (단 static과 default는 예외 JDK1.8부터)

 

인터페이스의 상속

인터페이스는 인터페이스부터만 상속받을 수 있으며, 클래스와는 달리 다중상속, 즉 여러개의 인터페이스로부터 상속 받는 것이 가능하다.

 

[사운드효과 인터페이스]

package ch12;

 

public interface SoundEffect {

public abstract void notification();

 

}

[리모컨 인터페이스]

package ch12;

 

public interface RemoteController {

void turnOn();

void turnOff();

}

[장난감 로봇이 리모컨과 사운드 효과 인터페이스를 상속받음]

package ch12;

 

public class ToyRobot extends RemoteController, SoundEffect { }

클래스의 상속과 마찬가지로 자손 인터페이스(ToyRobot)는 조상 인터페이스(RemoteController, SoundEffect)에 정의된 멤버를 모두 상속받는다.

ToyRobot 자체에는 정의된 멤버가 하나도 없지만 조상 인터페이스로 부터 상속받는 두 개의 추상메서드를 멤버로 갖게된다.

 

인터페이스의 구현

인터페이스도 추상클래스처럼 그 자체로는 인스턴스를 생성할 수 없으며, 추상클래스가 상속을 통해 추상메서드를 완성하는 것처럼, 인터페이스도 자신에 정의된 추상메서드의 몸통을 만들어주는 클래스를 작성해야 하는데, 그 방법은 추상클래스가 자신을 상속받는 클래스를 정의하는 것과 다르지 않다.

다만 클래스는 extends키워드를 사용하지만 인터페이스는 구현한다라는 의미의 implements를 사용한다.

 

package ch12;

 

public class ToyRobot implements RemoteController, SoundEffect {

 

 

@Override

public void turnOn() {

System.out.println("장난감 로봇을 켭니다.");

}

 

@Override

public void turnOff() {

System.out.println("장난감 로봇을 끕니다.");

}

 

@Override

public void notification() {

System.out.println("뚜뚜두두두두~~");

 

}

 

}

왜 인터페이스를 사용할까?
: 인터페이스의 장점은 아래와 같다.

- 개발시간 단축
- 표준화가 가능
- 서로 관계없는 클래스들에게 관계를 맺어 줄 수 있다.
- 독립적인 프로그래밍이 가능
반응형

'Java > Java 이론' 카테고리의 다른 글

문자열 자료형  (1) 2023.09.08
[JAVA] 참조변수의 형변환  (0) 2023.08.11
[JAVA] String 클래스  (0) 2023.08.10
[JAVA] 추상 클래스와 메서드  (0) 2023.08.10
[JAVA] 다형성  (0) 2023.08.10
반응형

문자열을 만들 때에는 두 가지 방법, 문자열 리터럴을 지정하는 방법과 String 클래스의 생성자를 사용해서 만드는 방법이 있다.


변경불가능한 클래스

String 클래스에서는 문자열을 저장하기 위해 문자형 배열 참조변수(char[ ]) value를 인스턴스 변수로 정의해놓고있다.

한번 생성된 String인스턴스가 갖고 있는 문자열은 읽어 올 수 만있고, 변경할 수는 없다.

예를 들어 + 연산자를 이용해서 문자열을 결합하는 경우 인스턴스 내의 문자열이 바뀌는 것이 아니라 새로운 문자열이 담긴 String 인스턴스가 생성되는 것이다.

String str1 = "반가워"; // 문자열 리터럴 "반가워"의 주소가 str1에 저장됨

String str2 = new String("반가워");  // 새로운 String인스턴스를 생성

String str3 = "반가워";  // 문자열 리터럴 "반가워"의 주소가 str3에 저장됨

  • String 클래스의 생성자를 이용한 경우에는 new 연산자에 의해 메모리 할당이 이루어지기 때문에 항상 새로운 String 인스턴스가 생성된다.
  • 문자열 리터럴은 이미 존재하는 것을 재사용하는 것이다.

이 때의 몇가지 시나리오를 확인해보자.

public static void main(String[] args) {

 

// String

// 문자열이라는 데이터를 보관이나 연산할때 사용

// static 영역, 데이터 영역, --> 상수 풀 영역

 

String str1 = "반가워";

String str2 = new String("반가워");

String str3 = "반가워";

 

System.out.println(str1);

System.out.println(str2);

// 시나리오 1

if(str1 == str2) { // str1은 상수풀 영역에, str2는 힙메모리 영역에 있어 주소값이 다름

System.out.println("주소가 같아요");

} else {

System.out.println("주소값이 달라요");

}

 

// 시나리오 2

// 리터럴 방식으로 생성한 문자열은 이미 생성한 값이 똑같다면 새로 만들지 않고 재활용한다.

if(str1 == str3) {

System.out.println("주소 같음");

} else {

System.out.println("주소 다름");

}

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

// 시나리오 3

str3 = "반갑습니다"; // 값을 변경

if(str1 == str3) { //str3의 값을 변경하여 상수 풀 메모리에 새로 생성됨

System.out.println("주소 같음");

} else {

System.out.println("주소 다름");

}

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

// 시나리오 4

// 문자열에 값을 비교하려면 equals를 반드시 사용

if(str1.equals(str2)) { // str1과 str2의 주소값을 비교하는 것이 아닌 문자열을 비교하므로 값은 "반가워"로 같으므로 같은 값입니다가 출력

System.out.println("같은 값입니다.");

} else {

System.out.println("다른 값입니다.");

}

[실행값]

주소값이 달라요

주소 같음

=============================

주소 다름

=============================

같은 값입니다.

반응형

'Java > Java 이론' 카테고리의 다른 글

[JAVA] 참조변수의 형변환  (0) 2023.08.11
[JAVA] 인터페이스(interface)  (0) 2023.08.11
[JAVA] 추상 클래스와 메서드  (0) 2023.08.10
[JAVA] 다형성  (0) 2023.08.10
[JAVA] 객체지향 언어  (0) 2023.08.09
반응형

추상클래스(abstract class) : 미완성 설계도

클래스를 설계도로 비유하면 추상클래스는 미완성 설계도라 볼 수 있다. 클래스가 미완성이라는 것은 멤버의 개수에 관계된 것이 아니라, 단지 미완성 메서드(추상 메서드)를 포함하고 있다는 의미이다.

  • 미완성 설계도이므로 인스턴스를 생성할 수 없다.
  • 미완성 메서드(추상 메서드)를 포함하고 있는 클래스

추상 클래스 사용법은 'abstract'를 붙이기만 하면 된다.


abstract class 클래스이름 {
         ....
}
 추상메서드

메서드는 선언부와 구현부로 구성되어 있다.

선언부만 작성하고 구현부는 작성하지 않은 채로 남겨둔 것이 추상메서드이다.

즉, 설계만 해놓고 실제 수행될 내용은 작성하지 않았기 때문에 미완성 메서드인 것이다.

왜 미완성으로 놔둔 것일까? 그 이유는 메서드의 내용이 상속받는 클래스에 따라 달라질 수 있기 때문에 조상 클래스에서 선언부만 작성해놓고, 주석을 덧붙여 어떤 기능을 수행할 목적으로 작성되었는지 알려주고, 실제 내용은 상속받는 클래스에서 구현하도록 비워두는 것이다.

  • 추상메서드 역시 'abstract'를 앞에 붙여주고, 추상메서드는 구현부가 없으로 괄호 대신 문장의 끝을 알리는 세미콜론(;)을 적어준다.

// 주석을 통해 어떤 기능을 수행할 목적으로 작성하였는지 알려준다.
abstract 리턴타입 메서드이름 ( ) ;

package ch07_1;

 

public abstract class Computer {  // 추상클래스

 

public abstract void display();

public abstract void typing();

public void trunOn() {

System.out.println("전원을 킵니다.");

}

public void turnOff() {

System.out.println("전원을 끕니다");

}

}

package ch07_1;

 

public class DeskTop extends Computer {

 

 

// 추상메서드 -> 구현메서드로 오버라이딩

@Override

public void display() {

System.out.println("모니터로 화면을 보여줍니다.");

 

}

 

@Override

public void typing() {

System.out.println("키보드로 타이핑을 합니다.");

 

}

 

}

반응형

'Java > Java 이론' 카테고리의 다른 글

[JAVA] 인터페이스(interface)  (0) 2023.08.11
[JAVA] String 클래스  (0) 2023.08.10
[JAVA] 다형성  (0) 2023.08.10
[JAVA] 객체지향 언어  (0) 2023.08.09
[JAVA] switch 문  (0) 2023.08.09
반응형

다형성(polymorphism)  : 여러 가지 형태를 가질 수 있는 능력

  • 하나의 코드가 여러 자료형으로 구현되어 실행되는 것
  • 같은 코드에서 여러 다른 실행 결과가 나옴
  • 정보은닉, 상속과 더불어 객체지향 프로그래밍의 가장 큰 특징 중 하나
  • 다형성을 잘 활용하면 유연하고, 확장성있고, 유지보수가 편리한 프로그램을 만들 수 있음

이전까지 인스턴스 타입과 일치하는 타입의 참조변수만을 사용해왔지만

만약 두 클래스가 상속관계라면 다형성을 적용할 수 있다. 즉, 조상 클래스 타입의 참조변수로 자손 클래스의 인스턴스를 참조하는 것도 가능하다.

package ch06;

 

public class Animal {

 

public void makeSound() {

System.out.println("동물이 소리를 내고 있습니다.");

}

 

 

}

package ch06;

 

public class Brid extends Animal{

 

@Override

public void makeSound() {

System.out.println("새가 지저귀고 있습니다.");

}

 

public void fly() {

System.out.println("새가 날아갑니다.");

}

 

}


Bird b = new Brid ( ) ;   // 참조 변수와 인스턴스의 타입이 일치
Animal a = new Brid ( ); // 조상 타입(Animal) 참조 변수로 자손타입(Bird) 인스턴스 참조

Animal 타입의 참조변수로는 Bird 인스턴스 중에서 Animal 클래스의 멤버들(상속받은 멤버포함)만 사용할 수 있다.

따라서 생성된 Bird 인스턴스 멤버 중에서 Animal 클래스에 정의되지 않은 멤버 fly( )은 참조변수 a로 사용이 불가능하다.

즉, a.fly( )와 같이 할 수 없다는 것이다.

둘 다 같은 타입의 인스턴스지만 참조변수의 타입에 따라 사용할 수 있는 멤버의 개수가 달라진다.


반대로 자손타입의 참조변수로 조상타입의 인스턴스를 참조할 수 있을까?

정답은 불가능하다 이다.

실제 인스턴스인 Animal의 멤버 개수보다 참조변수 b가 사용할 수 있는 멤버 개수가 더 많기 때문이다.

  • 조상타입의 참조변수로 자손타입의 인스턴스를 참조할 수 없다!
  • 반대로 자손타입의 참조변수로 조상타입의 인스턴스를 참조할 수는 없다
반응형

'Java > Java 이론' 카테고리의 다른 글

[JAVA] String 클래스  (0) 2023.08.10
[JAVA] 추상 클래스와 메서드  (0) 2023.08.10
[JAVA] 객체지향 언어  (0) 2023.08.09
[JAVA] switch 문  (0) 2023.08.09
[JAVA] 상속 (2)  (0) 2023.08.08
반응형
객체지향 언어의 특징을 알아보자

1. 코드의 재사용성이 높다.
새로운 코드를 작성할 때 기존의 코드를 이용하여 쉽게 작성할 수 있다.
2. 코드의 관리가 용이하다.
코드간의 관계를 이용해서 적은 노력으로 쉽게 코드를 변경할 수 있다.
3. 신뢰성이 높은 프로그래밍을 가능하게 한다.
제어자와 메서드를 이용해서 데이터를 보호하고 올바른 값을 유지하도록 하며,
코드의 중복을 제거하여 코드의 불일치로 인한 오동작을 방지할 수 있다.
 클래스와 객체

클래스란 객체를 정의해놓은 것, 설계도 또는 틀 이라고 정의할 수 있다.

클래스는 객체를 생성하는데 사용되고, 객체는 클래스에 정의된 대로 생성된다.

 

객체란 실제로 존재하는 것을 의미한다.

예를 들어 휴대폰, 노트북, 책상, 의자 등등.... 같은 사물들이 객체라고 한다. 

사물과 같은 유형적인 것뿐만 아니라 개념이나 논리와 같은 무형의 것도 객체로 간주한다.

 

객체의 속성과 기능

객체는 속성과 기능의 두 종류의 구성요소로 이루어져 있으며, 일반적으로 객체는 다수의 속성과 기능을 갖는다.

객체는 속성과 기능의 집합이라 볼 수 있다.

클래스란 객체를 정의한 것이므로, 클래스에 정의된 속성과 기능을 가진 객체가 만들어지는 것이다.

이해하기 쉽게 예를 들어 휴대폰을 생각해보자.

휴대폰의 속성으로는 전원상태, 색상, 길이, 크기 등이 있으며, 기능으로는 전화걸기, 문자보내기, 볼륨 높이기 등이 있다.

 

객체지향 프로그래밍에서는 속성과 기능을 각각 변수, 메서드로 표현한다.

 

속성(property) ---> 멤버변수(variable)

기능(function) ---> 메서드(method)

 

한 파일에 여러 클래스 작성하기

하나의 소스파일에 하나의 클래스만을 정의하는 것이 보통, 하나의 소스파일에 둘 이상의 클래스를 정의하는 것도 가능하다. 이 때 주의해야 할 사항이 있는데, 소스파일의 이름은 public class의 이름과 일치해야한다는 것이다.

만일 소스파일 내에 public class가 없다면, 소스파일의 이름은 소스파일 내의 어떤 클래스 이름으로 해도 상관없다.

 

올바른 작성예시
Hello2.java
---------------------------------------
public class Hello2 { }
           class Hello3 { }
---------------------------------------
* public class가 있는 경우, 소스파일의 이름은 반드시 public class의 이름과 일치해야한다.
Hello2.java
---------------------------------------
class Hello2 { }
class Hello3 { }
---------------------------------------
* public class가 하나도 없는 경우, 소스파일의 이름은 Hello2.java / Hello3.java 둘 다 가능하다.
잘못된 작성 예시
Hello2.java
---------------------------------------
public class Hello2 { }
public class Hello3 { }
---------------------------------------
* 하나의 소스파일에 둘 이상의 public class가 존재하면 된다.
각 클래스를 별도의 소스파일에 나눠서 저장하거나 둘 중 한 클래스에 public을 붙이지 않아야 한다.
Hello3.java
---------------------------------------
public class Hello2 { }
           class Hello3 { }
---------------------------------------
* 소스파일의 이름이 public class와 일치하지 않는다. 소스파일의 이름을 Hello2.java로 변경해야한다.
hello2.java
---------------------------------------
public class Hello2 { }
           class Hello3 { }
---------------------------------------
* 소스파일의 이름과 public class의 이름이 일치하지 않는다.
대소문자를 구분하므로 대소문자까지 일치해야 한다.
반응형

'Java > Java 이론' 카테고리의 다른 글

[JAVA] 추상 클래스와 메서드  (0) 2023.08.10
[JAVA] 다형성  (0) 2023.08.10
[JAVA] switch 문  (0) 2023.08.09
[JAVA] 상속 (2)  (0) 2023.08.08
[JAVA] 상속  (0) 2023.08.08

+ Recent posts