Java_생활코딩-2021.11.10

Jonguk Kim·2021년 11월 10일
0

Java

목록 보기
6/7

1. 오버라이딩 (overriding)

  • 하위 클래스에서 상위 클래스의 기본적인 동작방법을 변경할 수 있어야 함 => 메소드 오버라이딩
  • 기본동작은 폭넓게 적용되고, 예외적인 동작은 더 높은 우선순위를 가짐
  • 메소드의 서명(signature)
    • 메소드 이름
    • 메소드 매개변수 갯수 / 데이터 타입 / 순서
    • 메소드 리턴 타입
  • 하위 클래스 메소드에서 상위 클래스의 메소드를 호출하기 위해서 super를 사용 (코드 중복 제거)
class Calculator {
    int left, right;
 
    public int avg() {
        return ((this.left + this.right) / 2);		// 코드 중복
    }
}
 
class SubstractionableCalculator extends Calculator {
    public int avg() {
    	// return ((this.left + this.right) / 2);	// 중복 제거
        return super.avg();		// 상위 클래스 메소드 호출
    }
}

2. 오버로딩 (overloading)

  • 이름은 같지만 시그니처는 다른 메소드를 중복으로 선언할 수 있는 방법
  • 매개변수가 다르면 이름이 같아도 서로 다른 메소드가 됨
class Calculator{
    int left, right;
    int third = 0;		// 추가
      
    public void setOprands(int left, int right){	// 매개변수 2개
        System.out.println("setOprands(int left, int right)");
        this.left = left;
        this.right = right;
    }
     
    public void setOprands(int left, int right, int third){	// 매개변수 3개
        System.out.println("setOprands(int left, int right, int third)");
        this.left = left;
        this.right = right;
        this.third = third;
    }
     
    public void sum(){
        System.out.println(this.left+this.right+this.third);
    }
      
    public void avg(){
        System.out.println((this.left+this.right+this.third)/3);
    }
}
  
public class CalculatorDemo {
      
    public static void main(String[] args) {
          
        Calculator c1 = new Calculator();
        c1.setOprands(10, 20);			// 매개변수 2개면 2개의 메소드 호출
        c1.sum();       
        c1.avg();
        c1.setOprands(10, 20, 30);		// 매개변수 3개면 3개의 메소드 호출
        c1.sum();       
        c1.avg();
         
    }
  
}
  • 매개변수는 같지만 리턴타입이 다르면 오류가 발생
public class OverloadingDemo {
    void A (){System.out.println("void A()");}
    void A (int arg1){System.out.println("void A (int arg1)");}
    void A (String arg1){System.out.println("void A (String arg1)");}
    //int A (){System.out.println("void A()");}		// 오류 발생
    public static void main(String[] args) {
        OverloadingDemo od = new OverloadingDemo();
        od.A();
        od.A(1);
        od.A("coding everybody");
    }
}

3. 오버라이딩 VS 오버로딩

  • riding(올라탄다)을 이용해서 부모 클래스의 메소드의 동작방법을 변경
  • loading을 이용해서 같은 이름, 다른 매개변수의 메소드들을 여러개 만들 수 있음

4. 클래스 패스

  • javac ClasspathDemo.java => ClasspathDemo.class / Item.class 파일 생성 : 컴파일 => java ClasspathDemo : 실행
  • 클래스 하나는 하나의 클래스 파일이 됨
// ClasspathDemo.java
class Item{
}
 
class ClasspathDemo {
}
  • java -classpath ".;lib" ClasspathDemo2
  • java -classpath ".:lib" ClasspathDemo2
    • -classpath는 자바를 실행할 때 사용할 클래스들의 위치를 가상머신에게 알려주는 역할
    • . 은 현재 디렉터리에서 클래스를 찾는다는 뜻
    • : 는 경로와 경로를 구분해주는 구분자
    • lib 는 현재 디렉터리에 없다면 하위 디렉터리 중 lib 클래스 찾는다는 의미
  • 클래스 패스를 지정하는 것이 귀찮다면 클래스 패스를 시스템의 환경변수로 지정
  • 환경변수는 운영체제에 지정하는 변수 (자바가상머신에서 환경변수 값 참고해서 동작)

5. 패키지

  • 하나의 클래스 안에서 같은 이름의 클래스들을 사용하기 위한 방법
  • 패키지들은 물리적으로 같은 디렉터리에 존재할 수 없음
  • 서로 다른 패키지에 있는 클래스를 가져오려면 import를 통해서 다른 패키지의 클래스를 현재의 소스코드로 불러와야함
package org.opentutorials.javatutorials.packages.example2;
import org.opentutorials.javatutorials.packages.example1.A;		// 특정패키지의 클래스 가져옴
import org.opentutorials.javatutorials.packages.example1.*;		// 특정패키지의 클래스 전체 가져옴
 
public class C {
    public static void main(String[] args) {
        A a = new A();
    }
}
  • src : 소스 코드 들어있음
  • bin : 컴파일된 클래스 파일 들어있음

javac src/org/opentutorials/javatutorials/packages/example3/*.java
=> example3/ 하위에 있는 모든 자바 파일을 컴파일
==> 특별한 옵션을 주지 않으면 소스코드와 클래스 파일이 동일한 디렉토리에 위치

javac src/org/opentutorials/javatutorials/packages/example3/*.java -d bin
=> -d bin은 컴파일된 결과를 bin 디렉토리 하위에 위치시킨다는 의미
==> 자바 컴파일러는 자동으로 클래스의 패키지에 해당하는 디렉토리를 생성

  • 중복 회피
package org.opentutorials.javatutorials.packages.example3;
import org.opentutorials.javatutorials.packages.example1.*;
import org.opentutorials.javatutorials.packages.example2.*;
 
public class D {
    public static void main(String[] args) {
        org.opentutorials.javatutorials.packages.example2.B b = new org.opentutorials.javatutorials.packages.example2.B();
    }
}
profile
개발일지

0개의 댓글