Joslynn의 하루

대용량 웹서비스를 위한 MSA Full-Stack 개발자 양성 과정 -11일차 노트 필기_equals 메소드, 제한자 final, abstract_220801 본문

MSA Full-Stack 개발자 양성과정/Java

대용량 웹서비스를 위한 MSA Full-Stack 개발자 양성 과정 -11일차 노트 필기_equals 메소드, 제한자 final, abstract_220801

Joslynn 2022. 8. 1. 17:23

ex0729 실습 solution 필기

println 메소드: 인수로 객체가 오면 객체.toString() 자동 호출 및 리턴값 출력;

 

이클립스 단축키 모음

Alt + shift + s : source // 생성자, get&set 메소드, 오버라이드 등 자동 작성 가능;

ctrl+'space': 자동완성


this: 단독으로 사용 가능; 포함된 현재 객체 주소를 가르킴;

super: 단독으로 사용할 수 없음; 값을 보유하고 있는 것이 아닌 부모를 지칭하는 호칭일 뿐이므로;


equals 메소드

- equals 메소드의 본기능

boolean b = ( ).equals(Object obj) // 현재 객체와 인수로 전달된 객체의 주소값 비교 (== 동일 기능)

 

- String 객체에서 override된 메소드

String extends Object{
	
    equals 메소드(Object obj){
    	//인수로 전달된 객체와의 문자열 비교;
        //boolean형 return;
    }
}

 

class Test{

	/*Override
    public booean equals (Object obj){
    	return true;
    }*/

}

Test t = new Test();
Test t2 = new Test();

String s = new String("java");
String s2 = "java";
String s3 = "java";
String s4 = "hee";

if (t.equals(t2)) // Object에 정의된 equals 기능 == 인수로 전달된 객체와의 주소값 비교; // false;
if (s.equlas(s2)) // truel; String 객체에서 오버라이딩된 equals 메소드 호출;


/*-------------------------------------------------------------------------*/

String s4 = "hi";
/* s4 변수의 값을 변경하면, 해당 참조 객체는 연결이 끊기고 가비지 콜렉션, hi라는 새로운 객체를 생성;
String은 상수이며, 값이 변경되는 것이 아님; 새로운 객체가 생성되는 것;
*/

new 연산자가 없이 만들어진 객체

: 본인과 같은 값을 가진 객체가 있는지 확인;

: 같은 값을 가진다면 같은 객체를 가리키게 됨;

 

new 연산자를 사용해 만든 객체

: 같은 값을 가져도 무조건 새로운 객체 생성;

 


제한자 final 

 

final field vs  final static field(상수)

공통점: final 키워드가 변수 앞에 붙으면 고정값을 가짐 == 값 변경 불가;

차이점:

1. final field

: 생성자를 통해 다양한 값으로 초기화하여 고정값으로 사용 가능;

2. 상수 final static field

: 파이(3.14xxxx...)처럼 누가 써도 동일한 값;

 

package ex0801_abstract_final;

class Test{
			final int i = 100; // final 필드
			static final int j = 100; // 상수
			/*멤버필드를 선언과 동시에 초기화할 경우 final 필드와 상수 간에 차이가 없음*/
			
			final int x; // final 필드: 명시적 초기화 & 생성자를 이용한 초기화 모두 가능
			static final int y = 3; // 상수: 명시적 초기화 가능, 생성자를 이용한 초기화 불가
			
			Test(int a){ // 생성자
				this.x = a; // final 필드 초기화 가능
				// j = a; non-static은 static에 접근할 수 없음; 명시적 초기화
			}
			
}

public class FinalVariableExam {
	public static void main (String [] args) {
		new Test(5); 
		new Test(100);
		// 다양한 값으로 final field 초기화 가능;
	
	}

}

제한자 abstract

abstract method

: 구현부가 없음; 자식 class에서 재정의하기 위해 존재;

: abstract method를 가지고 있는 class는 반드시 abstract class로 선언해야 한다.

: abstract class는 생성할 수 없으며, 상속만 가능; ↔ final (생성만 가능, 상속 불가)

: 자식 class에서는상속 받은 모든 abstract method를 제한자 abstract을 제외하고 메소드 오버라이딩이 필요;

// 그렇지 않으면, 자식 class도 abstract class가 되어야 하기 때문에 객체 생성 불가;

 

abstract method 효용

: 실체 클래스들의 공통된 필드와 메소드의 이름을 통일할 수 있음; 즉, 규격서와 같이 사용되어 정형화된 코딩이 가능하다.

: 실체 클래스를 작성할 때 시간을 절약;

 

 

예제1)

package ex0801_abstract_final;

//Error 를 수정하고 이유를 주석으로 처리하세요.

final class FinalClassExam{ // 상속 불가, 생성 가능
 final int i = -999999; // 값 변경 불가, 반드시 사용 전에 초기화 필수
}


abstract class AbstractClassExam{ // 상속 가능, 생성 불가
    abstract String abstractMethodExam(int i,String s);  // 기능없고, 재정의해서 사용 
    final int finalMethodExam(int i, int j){ // 재정의 불가
        return i+j;
    }
}


class Sample01 extends AbstractClassExam{
	String abstractMethodExam(int i,String s){
		System.out.println("return "+s+i);
		return s+i;
	}
	
	/*int finalMethodExam(int i, int j){
		return i*j;
	} 
	final method로 재정의 불가*/ 
	
}

class Sample02 {}
/*extends FinalClassExam{  }  */ // final class는 상속 불가; 생성만 가능;

 
 class Sample03 extends AbstractClassExam{
	String abstractMethodExam(String s, int i){ // Overloading이 일어날 수 있도록 인수는 다르게 선언;
		return s+i;
	}
	 
	/*abstract*/ String abstractMethodExam(int i,String s) { // abstract method를 선언한 class는 반드시 abstract class로 선언; 
		return s;	
	}  

	void sampleMethod03(){
		System.out.println("void sampleMethod03() 호출 됨");
	}
}

 /*----------------------------------------------------------------------------------------------------------------------*/
 
class AbstractFinalClassTest{
    public static void main(String args[]){
		AbstractClassExam ace /*= new AbstractClassExam()*/; // abstract class는 객체 생성 불가;
		FinalClassExam fce = new FinalClassExam();
		//fce.i = 100000; // final field는 상수이므로 값 변경 불가;
		Sample01 s01 = new Sample01();
		AbstractClassExam aceS01 = new Sample01();
		aceS01.abstractMethodExam(700,"_999");
	}
}

 

Comments