같은 프로젝트에 같은 패키지 안에 있는 클래스 끼리 기본 접근 제한자인 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);
}
}
'java' 카테고리의 다른 글
22.11.08 접근제한자, 생성자, static, no-static (0) | 2023.02.13 |
---|---|
22.11.07 클래스 인스턴스화 및 생성자 (0) | 2023.02.13 |
22.11.02 다차원 배열, 클래스 객체화를 위한 설계 (0) | 2023.02.12 |
22.11.01 배열, 향상된 for문, 객체화(instance), 다중배열, 논리 연산 문자와 정수 변환 (0) | 2023.02.12 |
22.10.31 논리연산자, 증감연산자, 다중for문, 배열, ==, equals. (0) | 2023.02.12 |