Java Review - 참조 변수 슈퍼세트

지환·2023년 9월 22일
0

JAVA

목록 보기
10/39
post-thumbnail

9.21

  1. This 클래스 메소드(Static 메소드) 에서 사용할 수 있는가? + Static 메소드에선 this 사용 불가.
    => 없다.
  • 클래스 메소드는 인스턴스가 생성이 되지 않아도 사용가능함
  • 메모리에 생성되는 시점이 다르기 때문에 클래스 메소드에서는 this를 사용할 수 없다.
  1. 부모타입의 변수로 자식인스턴스를 참조할 수 있다.

  2. 생성자는 무조건 super() 생성자를 호출해야 한다.

  • 사용자가 super() 생성자를 호출하는 코드를 작성하지 않았다면 자동으로 부모의 기본 생성자가 호출된다
  1. 부모클래스가 기본 생성자를 가지고 있지 않다면, 사용자는 직접 super() 생성자를 호출하는 코드를 작성해야한다

  2. this() 생성자는 생성자 안에서 super() 생성자를 호출하는 코드 다음이나, 첫번째 줄에 위치해야한다.

  3. 부모 클래스의 생성자 호출
    자식 클래스의 생성자는 자동으로 부모 클래스의 기본 생성자를 호출하는 것이 아니라, 명시적으로 super()를 사용하여 부모 클래스의 특정 생성자를 호출해야 합니다.

    따라서 만약 부모 클래스가 기본 생성자(default constructor)를 갖고 있지 않고, 다른 생성자를 가지고 있다면 자식 클래스에서 super()를 사용하여 그 생성자를 호출해야 합니다.

9.22

<리턴타입>
1. 리턴되는 값이 없다면 //// 다른 메소드에서 그 메소드가 가진 데이터를 재사용할 수 있다. [복습]

  1. 리턴 다음에 오는 코드는 반드시 타입을 맞춰야 함.

  2. 하나만 반환할 수 있다.

  3. 만일 여러개의 값을 반환하고 싶다면 참조형 타입을 사용하면 된다 Return 클래스.-> Okay-> 배얼 뿐만 아니라, 클래스도 사용가능 대신, 전역변수 일 때.

package com.Review;

// 메소드의 파라미터로 참조형 타입을 사용하는 방법 --> 설명해보기
class Sonata{
	int Speed = 0; // 현재 소나타는 주차되어 있다.
	String carColor = "파랑";
}


public class WReturn3 {
	
	Sonata getCar() //리턴타입이 클래스 
	{
		return new Sonata();
		
		//return new Sonata(); == 같은 말 || Sonata himcar = new Sonata(); return himcar
	}


	public static void main(String[] args) {
		
		Sonata myCar = new Sonata();
		System.out.println(myCar.carColor);
		
		WReturn3 a = new WReturn3();
		a.getCar();
		
		myCar = a.getCar(); // 대입하려면 이런식으로 작성해야함
		

	}

}
  1. 리턴타입이 void가 아닌것은 대입연산자를 써서 반환되는 값을 담을 수 있다. int i = w.MethodB(); // i = w.MethodB();[X] - 타입 안 맞음
	int MethodB()
	{
		return 1;

	}
  1. System.out.println(Print1.m()); 메소드 호출 시 메소드 ( 파라미터 자리에 --> 메소드 호출 가능함))
  1. i = w.methodA(); // 리턴 타입이 없기 때문에 -> 대입 연산자에서 사용 불가하다. --> 만약에 int형이라면 사용가능하다.
void MethodA()
	{
	}

"변수에 메소드 값 넣기"


package com.Review;

//메소드 선언 문장
// (접근제한자 - 생략가능) 리턴타입 메소드이름(파라미터자리,1,2,,,,etc)

// 메소드 선언시 리턴 타입이 오는 자리에 void가 있다면 return예약어 쓸 수 없다.

//해당 부분 복습
// 리턴되는 값이 없다면 다른 메소드에서 그 메소드가 가진 데이터를 재사용할 수 있다.	

public class MethodReturn {
	void MethodA()
	{
		
		MethodB(7);
		
	}
	
	void MethodC()
	{
	}
	int MethodB(int k)
	{
		int j = k;
		return j;

	}
	// 리턴 다음에 오는 코드는 반드시 타입을 맞춰야 한다.
	// 하나만 반환 할 수 있다
	// 만일 여러개의 값을 반환하고 싶다면 참조형 타입을 사용하면된다.

	public static void main(String[] args) {
		// 여기에서 methodB의 반환값을 출력 할 수 있다. 
		
		MethodReturn w = new MethodReturn();
		// 리턴타입이 void가 아닌것은 대입연산자를 써서 반환되는 값을 담을 수 있다.
		int i = w.MethodB(30); 
		//해당 부분도 잘 보게 되면 반환되는 값이랑 리턴타입을 맞춰준걸 볼 수 있다. 해당 부분을 참고하여
		//작성해야된다.
		w.MethodA();
		
		System.out.println(i);
		
		int j = w.MethodB(20); 
		// int 형 변수 선언 ->> w.MethodB도 int형이라서 형이 맞아서 대입된다. 파라미터값도 꼭 보기!
		
		System.out.println(j);

	}

}
---------------------

30
20

"메소드의 파라미터로 참조형 타입을 사용하는 방법"


package com.Review;

//  학습목표 "메소드의 파라미터로 참조형 타입을 사용하는 방법" 
class Sonata1{
	int Speed = 0; 
	String carColor = "파랑";
}


public class CarSize {
	
	Sonata1 getCar() 
	{
		Sonata1 himcar = new Sonata1();
		return himcar;
		
	}


	public static void main(String[] args) {
		
		Sonata1 myCar = new Sonata1(); // myCar 객체생성--> 가르키는건 {0, '파랑'}이다.
		CarSize w = new CarSize(); // w 객체 생성--> getCar메서드 사용가능
		System.out.println(myCar.carColor); //파랑 출력
		
		Sonata1 hercar = w.getCar();
		System.out.println(myCar); 
		System.out.println(myCar.carColor); 
		System.out.println(hercar); 
		
		
		hercar.carColor ="검정색 ";
		System.out.println(hercar.Speed); 
		System.out.println(hercar.carColor); 
		
	}

}

package com.Review;

public class Print1 {
	static String name;
	
	
	static int m() 
	{
		return 5;
		
	} // 클래스 필드가 아니라 클래스 메서드이다.
	
	int  j() 
	{
		int k = Print1.m();
		System.out.println(k);
		return k;

	}

	public static void main(String[] args) {
		int i  =9;
		Print1 a = new Print1();
		System.out.println(1);
		System.out.println("안녕");
		System.out.println(1.5);
		System.out.println(true);
		System.out.println(Print1.m()); // 이 부분 복습 // 메소드 호출 시 메소드 ( 파라미터 자리에 --> 메소드 호출 가능함))
		System.out.println("==================");
		System.out.println(a.j()); // 이 부분은 안 된다. return 타입이 void라서
		
		
		/* 메소드의 파라미터 자리에서 또 다른 메소드를 호출 할 수 있다.
		 * 단 리턴 타입이 void인 건 아니다.
		 */
		
		 // 리턴 타입이 없기 때문에 -> 대입 연산자에서 사용 불가하다.
	}

}

package com.MyProject.ExampleCase;


class Pride1{
  int speed;
  String name;
}

public class PrideSimulation2 {

  public Pride1 Run(Pride1 a) // 클래스 타입 ---- 리턴 타입 
  {
	  //이번엔 클래스로 받아온 값을 재정의 하여 다시 쓰는 연습을 한다.
	  a = new Pride1(); // 객체를 재정의 한다. 객체가 하나 생긴 것. 
	  /*  다시 말하면 이 부분은 Stack에서 객체가 하나 생성되서 기존에 파라미터(클래스)에서 받아 온 값 자체를 
	   *  주소 번지 기준으로 가르키고 있었는데, 재정의 하여 새로운 객체를 할당 및 재정의를 한 것이다. 
	   *  그래서 새로운 객체가 생성된 것.
	   * 
	   */
	  a.speed = 10000;
	  System.out.println(a.speed);
	  return a; // 클래스 참조 변수를 리턴해야함

  }


  

  public static void main(String[] args){
	  
    Pride1 myCar = new Pride1();
    Pride1 herCar = new Pride1();
    Pride1 himCar = new Pride1(); // 총 3개의 객체가 만들어진다

    myCar.speed = 20;
    herCar.speed = 50;
    himCar.speed = 70;
    
    System.out.println(myCar.speed);
    System.out.println(herCar.speed);
    System.out.println(himCar.speed);
    
//    myCar.name = "아우디";
//    herCar.name = "벤츠";
//    himCar.name = "롤스로이스";

   

    PrideSimulation2 test1 = new PrideSimulation2();
     
    System.out.println(myCar.speed);

    test1.Run(myCar); 

    System.out.println(myCar.speed);
    
    myCar = test1.Run(myCar); 

    System.out.println(myCar);
   

    
  }

  
}
//getter 메소드는 전역변수에 담긴 값을 꺼낼 때 사용하자.
//setter 메소드는 전역변수가 private이라서 직접 접근이 불가능하니깐
// 메소드의 파라미터 자리를 활용하여 작성한다.
package com.Review;

public class EmpSimulation1 {

	//main메소드에서 출력하던 문장을 empPrint메소드로 꺼내서 처리하시오.
	public void empPrint(Emp emp) {//?자리는 지역변수 자리이다. 호출될때 결정된다.
		System.out.println(emp.empno +", "+emp.ename+", "+emp.job);	
	}
	public static void main(String[] args) {
		EmpSimulation1 es = new EmpSimulation1();
		Emp emp = new Emp();
		// 0, null, null
		System.out.println(emp);
		System.out.println(emp.empno +", "+emp.ename+", "+emp.job);
		emp.empno = 7566;//초기화, 재정의되었다. 
		emp.ename = "나신입";
		emp.job = "마케팅";
		//System.out.println(emp.empno +", "+emp.ename+", "+emp.job);
		es.empPrint(emp);
		//새로운 신입사원이 한 명 더 입사하였다.
		//그 사원의 사원카드를 작성해 보시오.
		//7499 나초보  매니저
		System.out.println(emp);
		emp = new Emp();
		emp.empno = 3522;
		emp.ename = "나초보";
		emp.job = "매니저";
		//System.out.println(emp.empno +", "+emp.ename+", "+emp.job);		
		es.empPrint(emp);
	}
}

---------------------
com.Review.Emp@4e50df2e
0, null, null
7566, 나신입, 마케팅
com.Review.Emp@4e50df2e
3522, 나초보, 매니저

참고 사이트

Dept.java


변수 
- 원시형타입  : int, char, double, float, etc...
- 참조형타입 : Class, method, Array, 
1. 클래스 선언하면 여러가지 종류의 변수를 가질 수 있다.
2. 메소드는 한 개도 정의하지 안하도 된다.
3. Dept.java는 세가지의 변수가 정의되어 있으므로 인스턴스화를 하면 
-> 한 번에 3가지 정보를 관리받는다.
4. Dept 클래스도 하나의 데이터 타입으로 받아들이자.

- 단점
세로방향


emp = empsimulation.email(new Emp()); 		이렇게도 사용 가능함

EmpSimulation

package com.Review;

public class EmpSimulation {

	public static void main(String[] args) {

		Emp emp = new Emp(); // 1
		 emp.empno = 70;
		
		 emp = new Emp(); // 2
		 emp.empno = 100;
		
		
		 emp = new Emp(); // 3개 같은 구조체처럼 3개의 설계도가 작성된다.
		 emp.empno = 2000;

		 
		 EmpSimulation empsimulation = new EmpSimulation();
		 System.out.println("==========================");


		 System.out.println(empsimulation.methodA());  // 주소번지가 나옴 
		 
		 emp = empsimulation.methodA();
		 
		 System.out.println("이메일 입력하세요" +emp.email + "  나이를 입력하세요 : "+ emp.empno + " 이름을 입력하세요 : "+ emp.ename);
		 
		 
		 emp = empsimulation.email(new Emp()); 		
		 System.out.println(emp.empno);
		 System.out.println(emp.ename);
		 System.out.println(emp.email);
		 System.out.println("==========================");
		 
		 System.out.println(emp);
		 System.out.println(emp.email);
		 System.out.println(emp.empno);
		 System.out.println(emp.ename);
		 System.out.println("==========================");

		 emp = empsimulation.ename(emp);
		 System.out.println(emp);
		 System.out.println(emp.email);
		 System.out.println(emp.empno);
		 System.out.println(emp.ename);

		 // methodB을 통해서  값 대입
		 
		 
		 
	}
	
	Emp methodA()
	{
		Emp a = new Emp();
		a.ename = "오지환";
		a.empno = 35;
		a.email = "qlwb7187@naver.com";
		return  a;
	}
	
	
	Emp email(Emp email_juso)
	{
		// 이 부분은 재정의가 필요한 부분이 아니라 
		// 파라미터 email을 값으로 받아들여 return 한다.
		
		email_juso.email = "qlwb7187@naver.com";
		email_juso.empno = 40;
		
		return email_juso;
	}
	
	
	
	Emp ename(Emp ename)
	{
		ename = new Emp();
		ename.empno = 50;
		ename.email = "ohjihwan123@naver.com";
		ename.ename = "강산이 변한다";
		return ename;
	}
	
	

	
}

Emp

package com.Review;

public class Emp {
	
	int empno = 0;
	String ename = null;
	String email = null;
	

}

EmpSimulation2

package com.Review;

public class EmpSimulation2 {
	
	
	
	
	void setEmp(Emp emp)
	{
		System.out.println(emp);
		emp.empno = 7655;
		emp.ename = "Smith";
		emp.job = "영업";
		System.out.println("============[before]============");
		System.out.println(emp.empno + "," + emp.ename + "," + emp.job);

	}
	
	
	public static void main(String[] args) {
		
		EmpSimulation2 es2 = new EmpSimulation2();
		Emp emp = new Emp();
		System.out.println(emp);
		es2.setEmp(emp);
		System.out.println("=========[after]============");
		System.out.println(emp.empno+","+emp.ename + "," + emp.job);
		
	
	
	}

}

같은 이름의 변수 이더라도 new를 사용해서 인스턴스화를 하면 새로운 객체가 만들어진다.
이때 변수가 세개 정의되어 있으므로 Dept클래스 선언시 주었던 초기값을 디폴트 값으로
기억하고 있다.

package com.Review;

public class EmpSimulation3 {

	void setEmp(Emp emp) {
		emp.empno = 9000;
		emp.ename = "JihwanOh";
		emp.job = "영업이다";
		System.out.println("====================[[before]]======================");
		System.out.println(emp.empno+", "+emp.ename+", "+emp.job);
	}
	public static void main(String[] args) {
		EmpSimulation3 es2 = new EmpSimulation3();
		Emp emp = new Emp();
		es2.setEmp(emp);
		System.out.println("====================[[after]]=======================");
		System.out.println(emp.empno+", "+emp.ename+", "+emp.job);
	}
}


CSimulation

package com.Review;


class C{
	int i = 1;
}//end of C


public class CSimulation {

	void methodA(C c) {
		c.i = 1;
		System.out.println("methodA ===> " + c.i);
	}
	
	
	public static void main(String[] args) {
		CSimulation cs = new CSimulation();
		C c = new C();
		cs.methodA(c);
		System.out.println("main ===> " + c.i);
	}//end of main
}
----------------------------------------------------------
methodA ===> 1
main ===> 1



class C{
	int i = 1;
}//end of C


public class CSimulation {

	void methodA(C c) {
		c.i = 10;
		System.out.println("methodA ===> " + c.i);
	}
	
	
	public static void main(String[] args) {
		CSimulation cs = new CSimulation();
		C c = new C();
		cs.methodA(c);
		System.out.println("main ===> " + c.i);
	}//end of main
}

----------------------------------------------------------
methodA ===> 10
main ===> 10
profile
아는만큼보인다.

0개의 댓글