20220711 Mon
프로젝트명 _ StringProject
public class String01 {
public static void main(String[] args) {
//문자열을 저장하는 자료형.
//기본자료형이 아닌 >> 참조자료형
//모든 클래스는 자료형이다.
//String은 이뮤터블변수(Immutable)
//->값이 한 번 들어가면 바뀌지 않는 변수
//String은 메모리 낭비를 줄이기 위해
//같은 값을 가진 문자열의 객체를 생성하지 않는다.
// [질문] 이 둘(10.11행- 12.13행)은 서로 차이가 있다 왜일까?
String str1 = "java";
String str2 = "java";
String str3 = new String("java");
String str4 = new String("java");
// [답]
// ' == ' : 숫자를 피연산자로 사용하면 '숫자가 같냐'로 이해.
//기본자료형 제외한 모든 경우 : 참조자료형을 대상으로 == 를 해석할 때는
//'두 객체가 동일한 객체냐?' 이를 물어본다.
if (str1 == str2 ) {// 문자열 비교는 원래 .equls 필요함
System.out.println("srt1과 srt2는 같습니다");
}
else {
System.out.println("srt1과 srt2는 다릅니다");
//[결과] srt1과 srt2는 같습니다
//[이유] 문자여러 string은 한번 값만들어지면 중복해서 만들지 않으므로 동일한 객체를 가리킴.
if (str3 == str4 ) {// 문자열 비교는 원래 .equls 필요로함
System.out.println("srt3과 srt4는 같습니다");
}
else {
System.out.println("srt3과 srt4는 다릅니다");
}
//[결과] srt3과 srt4는 다릅니다
//[이유] java라는 내용은 서로 같지만 새로운 객체를 만들어라(new)로 인해 둘은 다르다.
//(비유)똑같은 공장에서 찍어낸 같은 종류의 아반떼이지만 엄연히 서로 다른 차이다.
}
}
이전 내용 복습
public class String02 {
public static void main(String[] args) {
// [이들의 차이는 무엇일까]
// 문제 1_기본자료형
int a = 10;
int b = a;
a = 5;
System.out.println(a);//5
System.out.println(b);//10
System.out.println();
//문제 2_기본자료형 이외의 경우
int[] a1 = new int [1];
a1 [0]= 10;
int [] b1 = a1; // a1(정수형 배열)의 주소값을 넣어라.
a1[0] = 5;
System.out.println(a1[0]);//5
System.out.println(b1[0]);//5
System.out.println();
//예외
//문제 3_String(이뮤터블변수) 의 경우
//한 번 값이 들어가면 바뀌지 않는다!!!!
String s1 = "java";//한번들어가면 값 변하지않음.
String s2 = s1;// s1의 주소값 넣어라.
System.out.println(s1==s2);// s1 과 s2가 같은 객체인가?
//true
//여기까지는 둘 다 java 를 가리키기때문에
s1 = "c++";//추가의 공간을 만들어 c++ 값 만듦.
System.out.println(s1==s2);// s1 과 s2가 같은 객체인가?
//false
System.out.println(s1);//c++
System.out.println(s2);//java
}
}
public class String03 {
public static void main(String[] args) {
String str1 = "Coffe";
String str2 = "Bread";
//String.concat(String) -> 두 문자열의 나열 결과를 리턴(문자열 매개변수, 문자열 리턴값사용)
String str3 = str1.concat(str2);
System.out.println(str3);//CoffeBread
System.out.println("Coffee" + "Bread");//동일함.CoffeBread
//문자열 자르기 메소드
//String.substring(int)
String str4= "abcdefg";
System.out.println(str4.substring(2));//cdefg
System.out.println(str4.substring(1,4));//bcd
//문자열 자체 비교.
// ' == ' 와 다름.(객체 비교)
System.out.println(str4.equals("java"));
System.out.println(str4.equalsIgnoreCase("java"));//대소문자상관없이 같은지 비교 ->true/false리턴
String str5 = "월,화,수,목,금";
String [] a = str5.split(",");//문자열 str5를 ,로 자르기 // 문자열 배열로 리턴값.
}
}
프로젝트명 Inheritance
상속
//부모 클래스,super 클래스,기초 클래스,상위 클래스(Man)
public class Man {
String name;
public void tellName() {
System.out.println("My name is" + name);
}
}
//자식 클래스,sub 클래스, 유도 클래스,하위 클래스(BusinessMan)
class BusinessMan extends Man { //man 클래스 상속받는다.
//회사원만의 특별한 성질
String company;
String position;
public void tellInfo() {
System.out.println(" My Company is " + company);
System.out.println(" My Company is " + position);
}
}
public class ManTest {
public static void main(String[] args) {
BusinessMan man = new BusinessMan() ;
//상속을 받으면 내것처럼 사용가능.
man.name = " java";
man.tellInfo();
//'상속'을 사용하는 이유
//코드의 재사용성을 높이기위해서
}
}
//자바에서 상속은 여러 클래스를 받을 수 있을까? 아니다.
//부모클래스는 반드시 하나! 상속받는 자식클래스는 여러개 가능.
public class Person {
String name;
//부모클래스 변수는 부모클래스에서 생성자 생성한다.(적절)
//오버로딩 사용(생성자 중복 사용)
//생성자 1
public Person(String name) {// 매개정보일치하는 super("ddd"); 호출하면 오버로딩 필요x
this.name = name ;//매개변수로 들어온 값을 초기화한다.
}
//생성자 2
public Person() {// super(); 생략되어 호출되어있기 때문에 매개정보일치하는 생성자 필요함.
this.name = "김자바" ;//매개변수로 들어온 값을 초기화한다.
}
public void tellName() {
System.out.println("My name is" + name);
}
}
class Worker extends Person { //Person 클래스 상속받는다.
String company;
String position;
//생성자
//상속관계에 있는 생성자를 호출하면
//부모 클래스의 생성자도 반드시 자동 호출된다!!
public Worker () {
super();
//매개변수정보 일치하는 부모클래스 생성자 호출.
//매개변수 정보도 일치해야 오류가 나지않는다.
//항상 맨첫 줄에서 부모클래스의 생성자 호출이 생략되어있다.
company = "";
position = "";
// name = ""; >> 상속받았기 때문에 생성자 선언 가능하지만 부적절하다.
System.out.println(name);
}
public void tellInfo() {
System.out.println(" My Company is " + company);
System.out.println(" My Company is " + position);
}
}
public class PersonTest {
public static void main(String[] args) {
Worker w = new Worker();
//자식클래스 생성자 호출해도 부모클래스 생성자 자동 호출됨.
// >>부모클래스에서 name = "김자바"; 자동 호출.
}
}
**Object 클래스 상속
자바에서 모든 클래스는 사실상 Object클래스를 상속받고있다.
원래는 단일 상속만 가능하지만 사실 다중 상속도 가능하다.
비유) 할머니 - 엄마 - 나
public class A {// A클래스도 Object클래스를 상속받고있다.(생략)
int a ;
}
class B extends A {//a 라는 정수형 변수도 상속.
int b;
// int a ; 생략됨
}
class C extends B{ //a,b 정수형 변수 모두 상속.
int c;
// int b; 생략됨
// int a; 생략됨.
}
class D extends Object{
//생략되었지만 모든 클래스는 사실 Object클래스를 상속받고있다.
//사실상 " extends Object " 는 자바의 모든 클래스 뒤에 생략되어있다.
// 상속을 받는 모든 클래스들도 사실상 Objecct 클래스를 상속받고있다.
}
package Test;
public class ThisTest {
String name;
int age;
1번 생성자
public ThisTest() {
name = "";
age = 0;
}
2번 생성자
public ThisTest(String name) {
//this();
//해당 클래스에서 매개변수없는 생성자를 호출한다.
//this()가 오면 반드시 super();실행불가 >> 서로 같이 사용불가하다
// name = "";
// age = 0;//중복
// this.name = name;
// age =0;//중복
//중복제거
this();
this.name =name;
}
public ThisTest(String name, int age) {
//this(); 실행하면 아래 두 줄 실행.
// name = "";
// age = 0;
// this.name =name;
// this.age = age;
this(name);//매개변수로 문자열 하나 받는 생성자 호출하라. (2번생성자)
//this.name =name;//this사용시 중복제거
this.age = age;
}
}
package Test;
class A11 {
private int x;
private int y;
//생성자
public A11() {// ①---매개변수 없는 부모클래스 생성자 호출
//A클래스 x,y 변수 가져와서 바로 밑에 disp() 메소드로 이동.
x = 1;//본인 클래스 x
y = 1;//본인 클래스 y
}
public A11(int num) {
this.x = num;
y = 1;
}
public A11(int x, int y) {
this.x = x;
this.y = y;
}
//②--- (부모클래스 x,y 변수 값 가져와서) 출력하는 메소드.
public void disp() {
System. out.print( " x = "+ x + ", y = " + y + ",");// A클래스 x,y변수 출력해준다. 그 다음은 B클래스 x,y변수 출력하도록다.
}
}
class B11 extends A11 {
//부모클래스에서 private 변수사용했기때문에 B클래스는 x,y각각 2개씩 갖게됨.
private int x;
private int y;
public B11() {//①--- 매개변수없는 B클래스 생성자 호출
super(); //사실 생략된 것 ①--- 매개변수없는 부모클래스(A클래스) 생성사 호출
//A클래스에서 돌아온 뒤, x,y 값을 1로 선언한다. ( 출력값 모든 값이 1로 초기화되기위해)
x = 1;//본인 클래스 x
y = 1;//본인 클래스 y
}
public B11 (int num) {
super(num);//부모클래스에서 매개변수로 정수 하나 받는 생성자 실행한다.
this.x = 1;//본인 클래스 x
this.y = 1;//본인 클래스 y
}
public B11(int x,int y) {
super(x,y);
this.x = 1;
this.y = 1;
}
public B11(int x,int y, int num1) {
super(x,y);
this.x = num1;
this.y = 1;
}
public B11(int x,int y, int num1, int num2) {
super(x,y);
this.x = num1;
this.y = num2;
}
//[매소드 재정의]
//오버라이딩(Method Overriding)_메소드명 덮어쓰기
//상속관계에서 부모클래스에서 정의된 메소드를
//그대로 자식 클래스에서 재정의할 수 있다. (보기엔 2개이지만 1개로 봐야한다.)
//
public void disp() {
super.disp();//부모클래스 display 호출하겠다.
System. out.println( " x = "+ x + ", y = " + y);
}
//메소드 오버로딩 : 메소드명 동일, 매개변수 다름.
}
public class Work{
//반드시 main메소드를 가장 먼저 본다!!!
public static void main(String[] args) {
//모두 생성자 호출
B11 bp = new B11();//① 매개변수없는 B클래스를 생성자 호출.-> 기본값이기때문에 오류x
B11 bp1 = new B11(10);//매개변수로 정수하나 받는 생성자 호출
B11 bp2 = new B11(10,20);
B11 bp3 = new B11(10,20,30);
B11 bp4 = new B11(10,20,30,40);
//display 출력매소드
// ①---bp객체의 값을 가져와서 disp 메소드 기능 호출.
bp.disp();// x = 1, y = 1, x = 1, y = 1 // ①을 통해 A,B클래스에서 가져온 x,y값들을 넣어서 출력한다.
bp1.disp();// x = 10, y = 1, x = 1, y = 1
bp2.disp();// x = 10, y = 20, x = 1, y = 1
bp3.disp();// x = 10, y = 20, x = 30, y = 1
bp4.disp();// x = 10, y = 20, x = 30, y = 40
}
}