D+11:: String(Immutable) 변수/상속Inheritance/Object 클래스/this/super

Am.Vinch·2022년 7월 11일
0

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;		
	}
	
  • 3번 생성자
	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;
	}
	
}
  • 7/11T04 문제4번

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

}

}

profile
Dev.Vinch

0개의 댓글