본문 바로가기
개발/교육

(Java) 7일차

by kakk789 2022. 4. 5.

메소드의 중복(Method Overloading)

- 동일한 메소드 명이라도 자료형이나 매개변수의 개수가 다를 경우 다른 메소드로 취급 

배열 매개변수로 넘기기

- arr배열을 그대로 매개변수로 넘김

		int []arr = {6,2,3,9,7};
		
		System.out.println(util.getMax(arr));

class 변수, class 메소드 

  • static 변수, static 메소드 = 정적변수, 정적 메소드라고도 부름

class 변수

  • 멤버변수 앞에 static 키워드 붙어있는 변수를 말하며 객체 생성을 하지 않고 사용할 수 있음.

class 메소드

  • 메소드명 앞에 static 키워드가 붙어있는 메소드를 말하며 객체 생성을 하지 않고 사용할 수 있음

모두 클래스 이름으로 접근 가능하다.

클래스명.속성
class Person{
	static String addr; //
}

public class PersonTest {

	public static void main(String[] args) {

		Person.addr="dd"; 
	}
}
  • static 메소드 안에서 다른 변수나 메소드를 호출 할때 static이 붙어있지 않는 변수나 메소드는 호출 불가능
  • 왜냐하면, static은 컴파일 시점에 정의가 되는건데 당연히 일반 변수/메소드는 정의가 나중에 되기 때문임
  • 쉽게 설명하자면, static 메소드 안에서는 static만 호출 가능하다 라고 이해할 것

메모리 할당 영역 설명

* Method 영역 = Code 영역 (static) / Stack 영역 = 객체가 갖는 변수들의 주소 / Heap 영역 = 객체의 변수

* 스택의 객체명은 힙의 객체의 변수들의 주소를 갖음. (만일 해당 객체의 변수가 3개면 3개가 세트로 한 주소에 할당되어 짐)

Call By Value (값에 의한 호출)

  • 메소드 호출 시에 기본 자료형이 전달되는 것을 말하며, 메소드 안에서 전달된 값이 변경되더라도 호출하는 쪽에서는 변경된 내용이 적용되지 않음
class Exam01{

	//정수형 변수 하나를 매개변수로 전달받아 1 증가 시키는 메소드
	
	public static void plusOne(int n) {
		n=n+1;
		System.out.println(n);
		System.out.println("메소드 안에서 값을 변경하였습니다.");
	}
}


public class CallByValueTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		int age;
		age=28;
		
		Exam01.plusOne(age);
		System.out.println(age);
	}
}
age 값에 + 1을 했음에도 불구하고 실제 age는 변화 없이 28 그대로임

Call By Value

Call By Reference (참조에 의한 호출)

  • 메소드 호출 시에 참조 자료형(객체, 배열)이 전달되는 것을 말하며 메소드 안에서 전달된 값이 변경될 때에 호출하는 쪽에서 변경된 내용이 적용된다
  • 매개 변수로 객체나 배열을 받게 되면 해당 매개변수는 원본의 주소 값을 가리킨다. 그래서 객체나 배열을 받은 후 값을 변경하면 원본의 값도 같이 바뀐다.
  • 참조변수 : 메모리가 있는 영역을 가리키는 변수

배열을 참조 변조로 사용

결과 값을 보면 'plusOne' 함수 밖으로 나와서도 data[i]++가 적용 된 것을 확인 가능
class Exam02{
	
	// 정수형 배열을 매개변수로 전달받아 모든 요소를 출력하는 메소드를 정의
	public static void printArray(int []data) {
		for(int i=0; i<data.length; i++) {
			System.out.println(data[i] + "\t");
		}
	}
	// 정수형 배열을 매개변수로 전달받아 모든 요소를 1씩 증가시키는 메소드 
	public static void plusOne(int []data) {
		for(int i=0; i<data.length; i++) {
			data[i]++;
		}
		
		System.out.println("메소드 안에서 배열의 요소 출력");
		printArray(data);
	}
}

public class CallByReferenceTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		int []arr = {10,20,30,40,50};
		System.out.println(" 메소드하기 전의 배열" );
		Exam02.printArray(arr);
		
		Exam02.plusOne(arr);
		
		System.out.println(" 메소드 호출한 후 배열 " );
		Exam02.printArray(arr);
	}
}

Call By Reference

객체를 참조 변수로 사용

결과 값을 보면 'plusOne' 함수 밖으로 나와서도 age++가 적용 된 것을 확인 가능
class Person{
	String name;
	int age;

	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}
}

class Exam03{
	// person 객체를 매개변수로 전달받아 나이를 1증가 시키는 메소드를 정의
	
	public static void plusOne(Person p) {
		p.age++;
		System.out.println("메소드 안에서 출력");
		System.out.println(p.name + ", " + p.age);
		System.out.println();
	}
}

public class CallByReferenceTest02 {

	public static void main(String[] args) {
		
		Person kim = new Person("김민혁", 28);
		
		System.out.println("메소드 호출한 후 ");
		System.out.println(kim.name+","+kim.age);
		System.out.println();
		
		Exam03.plusOne(kim);
	}
}

자바 상속

public class 클래스명 extends 상속클래스명 {

}
    • A 클래스의 내용을 B클래스에서 그대로 상속받아 사용할 수 있음.
    • 상속 관계에 있을 경우 자식의 객체 생성하면 부모의 생성자가 먼저 동작하고 자식의 생성자가 후에 동작한다.
    • 한마디로 상속 관계에 있을 때에는 자식 클래스는 부모클래스의 생성자 형식을 그대로 따온 생성자를 만들어야 한다. (당연한 말이지만 헷갈릴 수 있으니 주의)
    • 재사용성, 유지보수의 편의성, 가독성을 높임, 코드의 양을 줄임

super( ) 

  • 부모의 생성자를 요구하는 메소드, 반드시 첫번째 줄에 와야함.
  • super는 부모의 생성자를 요구하는 것이니까 부모의 생성자도 실행됌
  • 언제 사용하냐면, 부모클래스와 자식클래스에 '같은 이름 / 같은 인자 값'을 같는 메소드가 존재할 경우에 부모 클래스의 메소드를 사용하고 싶을 경우에 'super.메소드' 를 사용

Protected

  • 상속관계에 있을 때에 아무리 자식클래스라 할지라도 부모클래스의 private 영역에는 접근할 수 없음.
  • 그래서 외부의 다른 클래스로부터는 보호하되, 상속한 자식 클래스들에게는 접근을 허용하기 위한 protected를 사용

name만 protected로 설정 했을 경우

private으로 된 속성은 참조 못해서 에러 발생

상속 관계에 있을 경우 부모 생성자가 먼저 동작

Customer의 기본 생성자는 기본적으로 Person의 기본 생성자를 실행시킴

class Person{
	public Person() {
		System.out.println("Person의 생성자가 먼저 동작함");
	}
}
class Customer extends Person{
	public Customer() {
		//super(); // super()가 기본적으로 생략되어 있음
		System.out.println("Customer의 생성자는 나중에 동작함");
	}
}
public class PersonTest {

	public static void main(String[] args) {
		Customer c = new Customer();
	}
}

메소드 오버라이딩(Overriding)

  • 상속 관계에 있을 때에 부모 클래스의 메소드가 자식 클래스에는 맞지 않아 재정의 하는 것을 말합니다.
  • 재정의 시 메소드 이름, 매개변수의 개수, 자료형이 일치되게 재정의 해야합니다.

부모클래스 fly( )

    public void fly() {
		if(wings==true) {
			System.out.println(color+"색 "+name+"이(가) 펄럭펄럭 ~");
		}
		else
		{
			System.out.println(color +"색 "+name+"이(가) 날수 없어요");
		}
	}

자식클래스 fly( ) 재정의

    public void fly() {
		System.out.println(color+"색 "+name+"이(가) 슝~");
	}

자바에서 모든 클래스의 조상 클래스는 Object 클래스이다.

  • 배열과 객체는 기본적으로 주소값을 가리키는 참조변수 이기때문에 == 비교 연산자 사용 불가능
  • 부모 Object 클래스의 equals 를 재정의하여 비교해보자.
* 중요
Object p 매개변수를 (Box) 클래스로 타입캐스팅 하여 b 로 저장하는 것이 중요함.

Box 클래스에서 Object 클래스의 equals 함수 재정의

class Box{
	double width;
	double length;
	double height;
	public Box(double width, double length, double height) {
		this.width = width;
		this.length = length;
		this.height = height;
	}	
	public boolean equals(Object p) { //equals 함수를 재정의
		boolean flag = false;
		Box b = (Box)p;  //매개 변수로 입력 받은 p를 비교할 Box으로 타입캐스팅 후 b로 저장
		if(b.width==width && b.length==length && b.height == height) {
			flag = true;
		}
		return flag;
	}
}

Main 함수

	public static void main(String[] args) {
		
		Box b1 = new Box(10, 20, 30);
		Box b2 = new Box(10, 20, 30);
		
		if (b1.equals(b2)) {
			System.out.println("같아요");
		}
		else {
			System.out.println("달라요");
		}

	}

만일 객체를 바로 출력하면 주소 값이 바로 출력되는데 이때 사용되는 함수는 toString() 함수로 기본적으로 생략되어져 있음

객체 바로 출력

toString, equals

  • 자바의 제일 조상인 Object의 메소드이며 필요하다면 자신의 클래스에 맞도록 재정의하여 사용할 것

toString() 오버라이딩 하는 경우 

  • 출력문에 객체를 표현하고자 할 때 사용
  • toString 은 object의 주소를 그대로 출력

equals() 오버라이딩 하는 경우

  • 서로의 동일한 속성값을 갖고있는지 판별하려면equals 메소드를 재정의하여 사용
  • equals는 주소 값에 저장된 값이 같은지 비교
반응형

'개발 > 교육' 카테고리의 다른 글

(Java)10일차  (0) 2022.04.08
(Java) 9일차  (0) 2022.04.07
(Java) 6일차  (0) 2022.04.04
(Java) 5일차  (0) 2022.04.01
22033) 숙제 4번, 4지 선다형  (0) 2022.03.31

댓글