[java] 메소드 오버로딩, 메소드 오버라이딩

심심이·2024년 2월 6일
1

java

목록 보기
32/46

메소드 오버로딩

같은 이름의 메소드를 여러개 생성하는 것

  • 이름만 같고 파라미터의 타입, 순서가 다른 경우 O
  • 접근제한자와 return타입만 다른 경우 X
String info() {
		return "아이디 : " + super.id + "\n" + "비밀번호: " + super.passwd;
	}

	public void info(int n) {
		System.out.println();
	}
	public void info(short m) {
		System.out.println();
	}
	
	public String info(int a, String str, byte d) {
		System.out.println();
		return str;
	}
	
	protected void info(String s,int b, byte f) { //순서가 다르기 때문에 OK
		System.out.println();
	}

생성자의 오버로딩

메소드 오버로딩과 규칙은 다르지 않다. (접근제한자가 달라도 파라미터가 같으면 중복)

	
	public Child() {	
	
    }
    
	public Child(String id, String passwd) {
		this.id = id;
		this.passwd = passwd;
	}
	/*
	public Child(String id, String passwd, String name) {
//		this.name = name;
//		this(id, passwd); // 생성자 내에서 다른 생성자를 불러올 수 있지만, 반드시 첫줄에서 불러와야 함. (Constructor call must be the first statement in a constructor)
 * 						  // 생성자가 먼저 위치하지 않았으므로 오류 발생
		this.passwd = passwd;
	}
	*/
	
	public Child(String id, String passwd, String name) {
		this.passwd = passwd;
	}
	
	

메소드 오버라이딩[상속]

메소드를 재정의하는 것

<오버라이딩 규칙>
1. 메소드의 오버라이딩 시 접근제한자는 부모클래스에서 정의해둔 메소드의 접근제한자보다 더 제한적이면 안된다.
2. 메소드의 오버라이딩 시 껍데기(return 타입, 메소드명, 파라미터)는 똑같아야 한다.
3. 메소드 안의 코드를 새롭게 정의해서 만들면 된다.

	@Override //애노테이션(어노테이션)
	String info() {
		return "아이디 : " + super.id + "\n" + "비밀번호: " + super.passwd;
	} //예시를 위해 getter setter 쓰지 않음
    
    //부모의 메서드를 오버라이딩해줄 때는 어노테이션을 꼭 쓴다.
    //부모의 값을 가져올 때는 super. 로 꼭 찝어서 가져와야 한다.
    //안그러면 자식 것이 나오는 사태가 발생한다. =자기 클래스 타입에서 먼저 찾음. 
	public void setName(String name) {
		
		Pattern p = Pattern.compile("^[가-힣]{2,6}$");
		
		Matcher m = p.matcher(name);

		if(m.matches()) {
			this.name = name;
		}
		else {
			 System.out.println("[경고] 성명은 공백이 없는 한글로만 이루어져야 하며 최소 2글자 이상 최대 6글자로만 되어져야 합니다.\n");
		}
					
	}


==>

	public void setName(String name) {
		this.name = name;
	}



// 자식 클래스 1> ------------------------------------------------------------------

@Override
	public void setName(String name) {
		
		Pattern p = Pattern.compile("^[가-힣]{2,6}$");

		Matcher m = p.matcher(name);

		if(m.matches()) {
			super.setName(name);
		}
		else {
			 System.out.println("[경고] 성명은 공백이 없는 한글로만 이루어져야 하며 최소 2글자 이상 최대 6글자로만 되어져야 합니다.\n");
		}
					
	}
    
    
// 자식 클래스 2> ------------------------------------------------------------------    
    
 	@Override
	public void setName(String name) {
		// 성명은 공백이 없는 한글 또는 영문으로만 이루어져야 하며 최소 2글자 이상 최대 6글자로만 되어져야 한다.
		
		// == 1. 정규표현식(Regular Expression) 패턴을 작성한다. == //
		Pattern p = Pattern.compile("^[가-힣A-Za-z]{2,10}$");
		// == 2. 문자열이 주어진 정규식 패턴과 일치하는지 판별하는 객체를 생성한다. == //
		Matcher m = p.matcher(name);
					
		// == 3. 판별하도록 한다. == //
		if(m.matches()) {
			super.setName(name);
		}
		else {
			 System.out.println("[경고] 성명은 공백이 없는 한글로만 이루어져야 하며 최소 2글자 이상 최대 10글자로만 되어져야 합니다.\n");
		}
		
	} 
	   

    
    

메소드 오버라이딩과 오버로딩의 차이

  • 오버라이딩은 부모로부터 상속받은 메소드를 재정의(내용물을 바꿈) 하고, 오버라이딩을 할 때 리턴 타입과 메소드의 이름과 파라미터는 동일해야 하며, 접근 제한자는 부모보다 제한적이면 안 된다.
  • 오버로딩은 오로지 파라미터만 다르면 되며, 리턴타입과 접근제한자는 상관없다. 파라미터의 매개변수가 같더라도 매개변수의 순서가 다르면 중복된 메소드로 보지 않는다.
profile
개발하는 심심이

0개의 댓글

관련 채용 정보