본문 바로가기
java

22.11.03 클래스 인스턴스화 심화

by SoulMania 2023. 2. 12.

CarEx01.java
0.00MB
CarEx01Main.java
0.00MB
ch06.zip
0.00MB
Tire01.java
0.00MB
설명.txt
0.02MB
진도 내용.txt
0.00MB

같은 프로젝트에 같은 패키지 안에 있는 클래스 끼리 기본 접근 제한자인 public이라고 가정했을때 클래스를 인스턴스화 하여 그 클래스에 있는 변수 및 메소드를 불러와 사용이 가능하다.

상속의 개념과는 다르다.

[접근제한자] [제어자] class 클래스명{

//field-데이터저장
//타입 변수명[=초기값];

//method-동작.기능
//[접근제어자][제어자] 리턴유형 메서드명(){}
}


package ch05;

/*클래스는 객체를 생성하고,

  • 생성한 객체를 통해
  • 해당 클래스의 필드(변수)와 메서드에 접근한다.
  •  
  • new 클래스명(); //객체생성
  • 타입 참조변수명; //객체를 담기위한 참조변수 선언
  • 타입 참조변수명 = new 클래스명(); //객체생성 및 생성한 객체를 참조변수에 할당(힙영역에저장) new를 안 붙이면 스택영역에 저장. -->일반 변수선언과 동일.
  • 하지만 스택영역을 통해 힙영역으로 갈 수 있다>???
  •  
  • String타입 (p.145~148)★★★★★
    • 문자열 리터럴 동일하다면 String 객체 공유
  • String클래스 (p.496~)★★★★★
  •  
  • ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
  • ==주소지비교. 동일주소(를 가리키면)이면 true
  • 기준문자열.equals(비교문자열) 값(value)비교. 동일값이면 true
  • ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
  • /

public class StringEx01 {

//메인메소드이며 다른말로 진입 메소드 라고 표현을 한다.
public static void main(String[] args) { //괄호안에 String[] args 가 안들어가면 컴파일 에러는 없지만 실행 시 아무것도 안나온다.
    int a = 10;
    int b = 10;
    System.out.println("a="+a); // 결과값 10
    System.out.println("b="+b); // 결과값 10
    System.out.println("a==b의 결과:"+(a==b));// true
    //System.out.println("a.equals(b)의 결과값:"+(a.equals(b))); //true
    System.out.println("---------------------------------------------------------------------");

    //System.out.println("~~~"); 해당기능은 무조건 메서드 선언해야 사용가능
    String str1 = "홍길동";
    String str2 = "홍길동";
    System.out.println("str1="+str1); // 결과값 홍길동
    System.out.println("str2="+str2); // 결과값 홍길동
    System.out.println("str1==str2의 결과값:"+(str1==str2)); //true
    System.out.println("str1.equals(str2)의 결과값:"+(str1.equals(str2))); //true
    //동일 주소를 가리킨다. 또는 참조한다. 따로따로 선언했지만 같은 주소지를 가리키는 것.
    System.out.println("---------------------------------------------------------------------");

    //객체생성 및 생성한 객체 를 참조변수에 할당
    String str3 = new String("홍길동");
    String str4 = new String("홍길동");
    System.out.println("str3="+str3); // 결과값 홍길동
    System.out.println("str4="+str4); // 결과값 홍길동
    System.out.println("str3==str4의 결과값:"+(str3==str4)); //false
    //==은 참조가 같다는 뜻을 내포하고 있기 때문에 참조변수로 선언된 것은 단순 ==은 다르게 나온다.(모양은 같아도 주소지가 다르다라는 뜻)
    //같은 주소지에 거주하는지를 묻는 뜻
    //주소가 다르다.!
    //같은 내용물을 선언했지만 주소지가 다 다른곳을 가리키는것. 독립적인 것.

    /*==연산자는 주소지를 비교하여
     * 주소지가 동일하면 true를 리턴하고 주소지가 일치하지 않으면 false를 리턴한다.
     * *****이러한 주소지 개념은 개발자가 필수적으로 알아야하는 개념이다.****** 
     * 이것은 스택영역안에 str3에는 힙영역에 있는 New String("홍길동") 이라는 값이 있는 주소값을 가지고 있다.
     * 마찬가지로 스택영역안에 str4에는 힙영역에 있는 New String("홍길동") 이라는 값이 있는 주소값을 가지고 있다.★★★★★★★★
     * 참조변수 또는 레퍼런스베리어블이라고 한다.
     * str3.이라하면 str3이가지고 있는 주소지로 가서 new String("홍길동")이라는 클래스가 가지고 있는 필드와 메소드를 사용!!한다는 뜻??
     */



    //참조변수명.메소드명() : 메소드 호출 방식 --> 참조변수명은 str3
    /* str3.equals(str4)
     * 참조변수 str3의 값이 참조변수 str4에 저장된 값과 일치하니? 라는 뜻
     * 일치하면 true를 리턴받고, 일치하지 않으면 false를 리턴받는다.
     */
    System.out.println("str3==str4의 결과값:"+(str3.equals(str4)) ); //true
    //단순히 겉 모양과 내용물만 비교할때는 이퀄스 를 써줘야 한다.
    //특히 그것이 참조변수로 선언된 값 원시데이터가 아닌 값일때는 특히 이퀄을 더 써줘야 한다. ->이것중에서는 String은 제외
    //원래 .equals 가 원시데이터 타입은 안되고 비원시 데이터만 되면서 주소지를 비교해주는것인데
    //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    //String 타입은 자체적으로 toString 또는 equals 한정 오버라이딩 하여 형태, 모양 비교를 하도록 된다.
    //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★


}

}


package ch06;

//이 클래스는 자동차 클래스이다.
/*
클래스 멤버라하면 필드와 메소드로 구성되어있다고 얘기한다.
class 클래스{
field- 데이터 터가 필요한 타입 변수
method()-기능, 동작을 수행
//리턴유형 메소드명(){수행하고자하는 동작, 구현코드}

  • 리턴 할 것이 없다.---> void
  • 정수, 실수, char, boolean, String, String[] 등
    }
  • /
    public class CarEx01 {
    //[]는 생략 가능 한 것들
    //field-데이터 = 전역변수
    //[접근제어자] [제어자] 타입 변수(필드)명 [ = 초기값;] 초기값 생략 가능생산일 20221102 "2022-11-02" Date클래스
    가격 5000
    제조회사 "현대"
    최고속도 250
    등급-'A'
    타이어
    제조회사 "한국"
    생산일2022-10-02생산
    가격 20
    사이즈 17.5
    미끄럼방지강화기능-있다 true/없다 false */
    String color = "red"; //색상
    int price = 5000; //가격
    String company = "HYUNDAI"; //제조회사
    int maxSpeed = 250; //최고속도
    int speed = 0; //현재속도 - 상태를 표현해주는 상태변수
    char grade = 'A'; //등급
    String productDate = "2022-11-02"; //생산일 타입을 잘못지정하면 추후에 형변환해야해서 번거롭다.
    //Tire01 tire = null; //타이어 -->null을 넣어 초기화 한것과 명시 안해서 자동 초기화 된것 모두 null로 초기화.클래스의 초기값은 null
    //초기값이 null인 이유는?
    //클래스, 배열 타입의 자동초기값은 null이기 때문에
    //heap영역의 주소가 아직 담기기전이라는 의미
    Tire01[] tires = null; // 타이어 클래스 배열
    //Tire01 타입을 배열로 선언한 이유는?
    //자동차의 타이어는 4개,
    //각 타이어의 데이터가 다르고 독립적이다. 예) 프론트 왼쪽의 마모율과 리어 오른쪽의 마모율은 다를 수 있다.
    // String[] tires={"","","",""};//움직이다
    void move(){}
    //멈춘다
    void stop(){}
    // //방향조절하다()
    // void turn() {
    // -->동작이나 기능이 조금 광범위하고 포괄적임
    // }
    //왼쪽이동하다()
    void turnLeft() {}
    //오른쪽이동하다()
    void turnRight() {}
    //전진하다()
    void turnFront() {}
    //후진하다()
    void turnBack() {}
    //속도조절하다()
    void controlSpeed() {} //선언가능... 메소드 오버로딩, 같은 클래스내에서 동일한 이름의 메소드를 여러개 선언하여 쓸수 있는것? p230 오버로딩
    void controlSpeed(int s) { //매개변수. 그때그때 달라지는 값을 저장할 수 있는 변수, 외부에서 내부로 연결해주는 매개변수 --->argument = parameter
    // void controlSpeed(float s) {
    // System.out.println("controlSpeed()진입");// speed+=5; //= speed++; = speed=speed+1;
    // int s=5;// speed=speed+(int)s;}
    //가속하다()
    void speedUp() {}
  • //speed=speed+50; //-->필드에 선언된 전역변수이기 때문에~~~ 인식됨 //현재속도가 최고속도 250 이내라면 증가 speed+=50; if(speed <= maxSpeed) { System.out.println("speedUp()호출-속도를 올립니다. 현재속도는 "+speed+"km Here We Go ~~~~♬♬♬♬♬♬♬♬♬♬♬♬♬♬♬♬♬♬♬♬"); } else { speed = maxSpeed; System.out.println("speedUp()호출-속도를 올리지 못했습니다. 현재속도는 최고속도인 "+speed+"km 입니다. ㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜ"); }
  • System.out.println("현재speed:"+speed); System.out.println("~~~~"); // 매개변수 있음 System.out.println(); //매개변수 없음 System.out.println(1); //매개변수 있음 System.out.println(3.14); //매개변수 있음 System.out.println('A'); //매개변수 있음 //println 또한 마찬가지.
  • //호출될때마다 현재스피드가 5씩 증가 speed=speed+s;
  • //호출될때마다 현재스피드가 1씩 증가
  • System.out.println("turnBack()호출-후진한다.");
  • System.out.println("turnFront()호출-직진한다.");
  • System.out.println("turnRight()호출-오른쪽으로 이동한다.");
  • System.out.println("turnLeft()호출-왼쪽으로 이동한다.");
  • speed=0; System.out.println("stop()호출-멈춘다.");
  • System.out.println("move()호출-움직이다.");
  • //method-기능, 행위, 동작
    //[접근제어자] [제어자] 리턴유형 메소드명(){};
  • /* 자동차
    색상 "red" ->

// if(speed < maxSpeed) {
// speed+=50;
// System.out.println("speedUp()호출-속도를 올립니다. 현재속도는 "+speed+"km Here We Go

♬♬♬♬♬♬♬♬♬♬♬♬♬♬♬♬♬♬♬♬");
// }else {
// System.out.println("speedUp()호출-속도를 올리지 못했습니다. 현재속도는 최고속도인 "+speed+"km 입니다. ㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜ");
// }
// }
//감속하다()
void speedDown() {
//speed=speed-50; //-->필드에 선언된 전역변수이기 때문에

인식됨
speed-=50;
if(speed>0) {
System.out.println("speedDown()호출-속도를 줄입니다. 현재속도는 "+speed+"km woo

~ Calm down ~

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
}else {
speed=1;
System.out.println("speedDown()호출-더이상 속도를 줄 일 수 없습니다. 현재속도는 "+speed+"km ");
}
// if(speed==0) {
// stop();
// }

}

// if(maxSp<currentSp) {
// System.out.println("speedDown()호출 - 속력을 줄입니다. / 경고! 현재속력: "+(currentSp-(currentSp-maxSp))+"km 빨리 속도를 줄이십시오. /");
// }else if(currentSp<0){
// System.out.println("더 이상 속도를 줄일 수 없습니다 "+ (currentSp-currentSp)+"km 발 떼세요");
// }else {
// System.out.println("speedDown()호출 - 속력을 줄입니다. / 현재속력: "+currentSp+"km 제한 속도 규격에 맞습니다.");
// }

// public static void main(String[] args) { //진입 메소드--> 만약 실행 및 런하지 않는다면 메인메소드가 필요하지 않다.
//
//
// }

}//class


package ch06;

//이 클래스는 CarEx01을 실행하는 클래스이다.
public class CarEx01Main {

public static void main(String[] args) {
    //class(클래스)를 이용하여 object(객체)를 생성한다. //Object O가 대문자 이면 클래스를 말하는 것. 오브젝트가 최상위계층인데 그곳에서 상속받은 것이므로.(조상클래스)
    //객체생성 문법> new 클래스명(); 정확히 말하면 클래스명과 동일한 이름을 가진 생성자, new 가 붙으면 무조건 힙영역에서 사용되어진다.
    //참조변수 또는 레퍼런스변수 선언을 해야한다. 참조변수 선언 문법>타입 변수명[=초기값];

    //참조변수선언 및 객체생성
    //클래스명 참조변수명 = new 클래스명();

    //CarEx01클래스의 객체를 생성. 힙영역의 주소가 myCar에 담긴 것이다. 
    CarEx01 myCar = new CarEx01();
    System.out.println(myCar); //콘솔 결과값 ch06.CarEx01@15db9742 -->내가 만든 CarEx01클래스의 객체를 담고있는 주소지
    //참조변수에 저장된 주소출력 한 것
    System.out.println(myCar.toString() );
    //Object클래스(교재 p457)/ toString()클래스-->객체문자정보 (교재 p464)
    //Object 클래스는 최상위클래스로써
    //모든클래스는 Object클래스를 상속받는다.
    //Object 클래스의 toString():객체의 정보를 문자형태로 리턴을 한다.
    //객체의 문자 정보란? 객체를 문자열로 표현한 값을 말한다.
    /*기본적으로 "ch06.CarEx01@15db9742" 이러한 형태로 제공되는데 이것은
     "패키지명.클래스명@16진수해시코드"로 구성된 문자 정보*/


    //메소드 호출 : 참조변수명.메소드명();
    myCar.move();

// System.out.println(myCar.toString() ); //메소드 안에 메소드가 있으면 안쪽 메소드 부터 실행한다.
//또는 아래처럼 나눠서 수행. -->변수하나 만들어서 리턴값 저장하고 그것을 뿌린다.
String addr = myCar.toString(); //리턴되는 형태를 알아야 적절한 형태로 선언해서 사용할 수 있다.
System.out.println("addr="+addr);
//toString은 myCar 클래스에 대한 정보를 문자열로 준다 라는 메소드다..!!!
//System.out.println(myCar); 랑 값이 똑같다.

    int addr1 = myCar.hashCode(); //교재 p461
    System.out.println("addr1="+addr1);


    //참고 교재  p295 메소드재정의 (오버라이딩)
    String name1 = "홍길동";
    System.out.println(name1); //홍길동
    String name3 = new String("홍길동");//  --> ==쓰면 안되고 .equals 메소드 사용해야한다. ==는 주소지가 다르니까.

// String name4 = name3.toString();
// System.out.println(name4);
System.out.println(name1.toString());
System.out.println(name3); //홍길동
System.out.println(name3.toString()); //홍길동-주소지가 아닌 그대로 자기 자신 문자열 출력
//오브젝트 클래스에서 선언되어 사용할 수있는 toString 메소드는 객체정보를 문자열로 표현하지만 Object.toString
//스트링 타입에 한에서는 그냥 그대로 문자열출력한다. 그리고 마우스로 정보를 보면 String.toString으로 소속도 재정의 되어진다.
//한마디로 문자열 타입은 자기 자신을 리턴. 메소드 재정의 = 메소드 오버라이딩 ★★★★★★★
//기본적으로 StringEx01에서 했던 == 비교연산자나 equals.메소드가 String 오버라이딩 예라고 보면 된다. 자동으로 오버라이딩해서 써지는 클래스가 스트링클래스

    //Main 클래스를 또 만들면 또 다른 자동차를 만드는 개념이라고 생각하면 된다.
    //

}

}

//참조변수명.메소드명(); -->메소드 호출 문법
//myCar.move();
//myCar.stop();
//myCar.turnFront();
//myCar.turnBack();
//myCar.turnLeft();
//myCar.turnRight();
//myCar.speedUp();
//myCar.speedDown();


package ch06;

//이 클래스 타이어에 대한 정보를 저장, 기능을 선언한 클래스
public class Tire01 {
//field-데이터저장
//[접근제어자] [제어자] 타입 변수명[=초기값]; --->외부에서 함부로 접근하지 못하도록 하기 위헤서는 접근제어자나 제어자를 선언해줘야 한다.
//설정하지 않으면 기본으로 세팅. 같은 패키지 안에서는 클래스가 달라도 접근되도록

int size = 17; // 타이어 사이즈
String brand = "GeumHo"; //타이어 브랜드
String prdYmd = "2022-10-01"; //제조년월일
int price = 200000; //타이어 개당 가격
double wearRate = 0.0; //마모율


//method-동작.기능
//[접근제어자][제어자] 리턴유형 메서드명(){}    --->외부에서 함부로 접근하지 못하도록 하기 위헤서는 접근제어자나 제어자를 선언해줘야 한다. 
                                            //설정하지 않으면 기본으로 세팅. 같은 패키지 안에서는 클래스가 달라도 접근되도록
//마모율 체크
void wearRateCheck(){
    System.out.println("wearRateCheck()호출-타이어 마모율을 체크한다.");
}
//미끄럼방지  기능이 있니?
boolean isNonSlip(){
    System.out.println("nonSlip()호출-미끄럼 방지 기능 있나요?.");
    return false;
}

}

/*클래스 선언 문법
[접근제어자] [제어자] class 클래스명 {

 //field-데이터저장
//타입 변수명[=초기값];

//method-동작.기능
//[접근제어자][제어자] 리턴유형 메서드명(){}

*/


package ch06;

//이 클래스는 CarEx01클래스의 실행클래스이다.
public class CarEx01Main2 {

public static void main(String[] args) {
    //CarEx01 클래스의 객체를 저장하기 위한 변수 선언
       //-참조변수 또는 레퍼런스변수 선언을 해야한다. 참조변수 선언 문법>타입 변수명[=초기값];
    CarEx01 myCar = null; //참조변수 선언

//

    //CarEx01 클래스의 객체생성
       //-참조변수선언 및 객체생성
       //-클래스명 참조변수명 = new 클래스명();
    myCar = new CarEx01();
    for(int i=0; i<3;i++) {
        myCar = new CarEx01();
        System.out.println(myCar);
        System.out.println(myCar.color);
    }//따로따로 선언하면 포문이 돌면서 1대 뽑고 2대 뽑고 3대 뽑고 순차적으로 다른 차 데이터 출력 가능.. 변수 1개로

// CarEx01 myCar = new CarEx01(); ---> 이건 한번에 하는 방법 이렇게 하면 포문 돌릴때 변수가 3개가 달라야한다. 이럴떈 배열로 처리.
// 하지만 위처럼 따로따로 선언하면 변수 하나로 포문처리 가능하다.
// CarEx01 myCar = new CarEx01();
////짝 Tire01 myTire = new Tire01(); //이게 없으면 아래 tires[i] = myTire; 이게 에러
//// CarEx01 myCar2 = new CarEx01();
//// CarEx01 myCar3 = new CarEx01();
//// CarEx01 myCar4 = new CarEx01();
// Tire01[] tires = new Tire01[4]; --> 비원시데이터 타입으로 배열을 정의 하려면 해당 이름과 같은 클래스가 존재해야한다.
// for(int i=0; i<3;i++) {
//// myCar = new CarEx01();
// tires[i] = new Tire01();
////
짝 tires[i] = myTire;
// System.out.println(tires[i]);
// }// 이런식으로

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


    //참조변수에 객체 저장 => 객체의 주소지를 저장
    System.out.println(myCar);

    //CarEx01 클래스의 데이터 출력 -> 필드에 접근해서 값을 가져오겠다는 뜻
    //참조변수명.필드명; : 필드의 값을 가져오기 -> get
    //참조변수명.필드명=값; : 필드의 값을 설정하기 -> set

    //색상

// String cl = myCar.color;
// System.out.println(cl);
System.out.println("myCar.color = "+myCar.color);
//제조사
// String man = myCar.company;
// System.out.println(man);
System.out.println("myCar.company = "+myCar.company);
//가격
// int pr = myCar.price;
// System.out.println(pr);
System.out.println("myCar.price = "+myCar.price); //가격 5000
myCar.price=4000; //참조변수명.필드명=값;
System.out.println("myCar.price = "+myCar.price); //가격 변경 후 4000
//등급
// char gr = myCar.grade;
// System.out.println(gr);
System.out.println("myCar.grade = "+myCar.grade);
//현재속도
// int sp = myCar.speed;
// System.out.println(sp);
System.out.println("myCar.speed = "+myCar.speed);

    //내가 접근한 객체가 가지고 있는 주소지의 데이터를 출력하는 것

    //CarEx01클래스의 기능수행->메소드 호출
    myCar.move();
    //앞으로 전진 > 가속 > 가속 > 오른쪽 > 왼쪽 > 전진 > 감속 > 정지
    myCar.turnFront();
    myCar.speedUp();//가속
    myCar.speedUp();//가속
    myCar.speedUp();//가속
    myCar.speedUp();//가속
    myCar.speedUp();//가속
    myCar.speedUp();//가속
    myCar.speedUp();//가속
    myCar.speedUp();//가속
    myCar.speedUp();//가속
    myCar.turnRight();
    myCar.turnLeft();
    myCar.turnFront();
    myCar.speedDown();//감속
    myCar.speedDown();//감속
    myCar.speedDown();//감속
    myCar.speedDown();//감속
    myCar.speedDown();//감속
    myCar.speedDown();//감속
    myCar.speedDown();//감속
    myCar.stop();

}

}


package ch06;

//이 클래스는 CarEx01클래스의 실행클래스이다.
public class CarEx01Main3 {

public static void main(String[] args) {

    CarEx01 myCar = null;
    System.out.println(myCar);//null;

// CarEx01 myCar = new CarEx01(); 한번에 선언 및 객체 생성
myCar = new CarEx01();
System.out.println(myCar);

    //필드값을 가져와 출력
    //필드값 get하기 : 참조변수.필드명
    //필드값 set하기 : 참조변수.필드명(변수명) = 값;
    //최고속도
    System.out.println("최고Speed = "+myCar.maxSpeed); //최고속도 250
    //현재속도
    System.out.println("현재speed = "+myCar.speed); //현재속도 0

    //움직이는 기능을 구현하세요 -> 메소드 Call : 참조변수명.메소드명();
    myCar.move();
    for(int i=1; i<250;i++) {
        myCar.controlSpeed(5);    //메인 클래스 에서 숫자 입력값을 넣는다. 호출할때 입력! CarEx01.java controlSpeed(int s) 로 정의 되었기 때문에 가능.

// myCar.controlSpeed(10.5f);// 실수 플로트로 던지면 받는 쪽에 speed가 인트기 때문에 s를 강제 형변환 (int)s를 꼭 붙여줘야 한다.
//그리고 그냥 실수를 쓰게 되면 기본이 double형이라서 받는쪽 s 타입도 무조건 double로 선언 해야한다.
}

// //색상
// System.out.println("myCar.color = "+myCar.color);
// //제조사
// System.out.println("myCar.company = "+myCar.company);
// //가격
// System.out.println("myCar.price = "+myCar.price); //가격 5000
// //등급
// System.out.println("myCar.grade = "+myCar.grade);

}

}