Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

말하는 햄zzi

스태틱(static)메소드/ 리팩토링/오버로딩/This / 추상클래스/DI 본문

Java/Java

스태틱(static)메소드/ 리팩토링/오버로딩/This / 추상클래스/DI

대양파 2023. 5. 10. 17:09
728x90

스태틱 메소드란?

-인스턴스를 생성하지 않고도 main() 메소드에서 바로 메소드를 호출가능

  ▷ static을 붙이면 JVM이 실행 될때 인스턴스를 생성하므로 new를 이용해

     인스턴스를 생성하지 않고도 main() 메소드에서 바로 메소드를 호출 할 수 있다.

 

 

스태틱 메소드 선언 방법

-Return type(리턴타입)앞에  static 을 붙이면 static method가 된다

public class 클래스이름() {
접근제어자 static 리턴타입 메소드이름() {
// 메소드의 기능
}
}

예제)

public class Calculator {
		public static void printMinus(int num1, int num2) {
				System.out.println(num1 - num2);
		}
		public static void main(String[] args) {
				printMinus(10, 20);
		}
}
더보기

결과 : -10 

 

다른 클래스에서 스태틱 메소드 호출

-스태틱 메소드는 접근제어자를 public으로 해놓았다면 다른 클래스에서도 바로 호출해서 쓸 수 있음

 

 

리팩토링

-코드를 효율적으로 만드는 작업으로 가장 처음에 하는 리팩토링은 주로 메소드로 분리하는 것

    ▷  가독성, 확장성, 유지보수성을 향상(주로 코드 중복 제거 및 비효율적인 부분을 개선)

예제)

→ 리팩토링 전

import java.util.Arrays;

public class SeparateIntoStaticMethod {
   public static void main(String[] args) {

        int[][] arr = {
                {10, 20, 30},
                {40, 50, 60},
                {70, 80, 90}
        };

        System.out.println(Arrays.toString(arr[0]));
        System.out.println(Arrays.toString(arr[1]));
        System.out.println(Arrays.toString(arr[2]));

        arr[0][0] = 0;
        arr[1][1] = 0;
        arr[2][2] = 0;

        System.out.println(Arrays.toString(arr[0]));
        System.out.println(Arrays.toString(arr[1]));
        System.out.println(Arrays.toString(arr[2]));
    }
}

→ 리팩토링 후 

import java.util.Arrays;

public class SeparateIntoMethod {
    public static void printArray(int[][] arr) {
        System.out.println(Arrays.toString(arr[0]));
        System.out.println(Arrays.toString(arr[1]));
        System.out.println(Arrays.toString(arr[2]));
        System.out.println("--------------------");
    }
    public static void main(String[] args) {
        int[][] arr = {
                {10, 20, 30},
                {40, 50, 60},
                {70, 80, 90}};

        printArray(arr);

        arr[0][0] = 0;
				arr[0][1] = 0;
        arr[0][2] = 0;

        printArray(arr);

        arr[1][1] = 0;

        printArray(arr);
    }
}//printArray’라는 별도의 메서드 생성하여 배열출력 부분을 분리
더보기

결과:

 [10, 20, 30]

[40, 50, 60]

[70, 80, 90]

-----------------------

[0, 0, 0]

[40, 50, 60]

[70, 80, 90]

------------------------

[0, 0, 0]

[40, 0, 60]

[70, 80, 90]

 

오버로딩

-한 클래스(Class)내에서 같은 이름의 메소드(Method)를 여러개 정의 하는 것

  오버로딩은 매개변수의 개수, 타입, 순서가 서로 다른 메서드를 정의하여 같은 이름으로 호출할 수 있게 해준다.

 

오버로딩 특징

  • 메서드 이름은 동일
  • 매개변수의 개수, 타입, 순서가 서로 달라야한다
  • 반환 타입은 오버로딩과 무관

예제)

public class Rectangle {
    private int width;
    private int height;

    // 기본 생성자
    public Rectangle() {
        this.width = 0;
        this.height = 0;
    }

    // 매개변수 하나인 생성자
    public Rectangle(int size) {
        this.width = size;
        this.height = size;
    }

    // 매개변수 두 개인 생성자
    public Rectangle(int width, int height) {
        this.width = width;
        this.height = height;
    }
}

 

오버로딩 VS 오버라이딩

  • 오버로딩(Overloading)은 기존에 없던 새 메서드를 정의 loading → 확장
  • 오버라이딩(Overriding)은 상속  메서드의 내용만 변경  Riding → 재정의

 

  • 오버라이딩(Overriding)3가지 조건

           메소드의 이름이 일치

           메소드 매개변수의 개수, 순서 그리고 데이터 타입이 일치

           메소드의 return 타입이 일치

 

This

객체 자신 참조 키워드( 객체 자기자신)

현재 객체를 가리키는 참조 변수

 - 클래스 내부에서 사용되며, 해당 클래스의 인스턴스를 지칭(static메서드 사용 불가 -인스턴스 내에서만 사용 0)

 

예제)

public class Codeup1098OOP {

   private int[][] arr;

   public Codeup1098OOP(int[][] arr) { // parameter로 받은 arr
	      this.arr = arr;
				// class의 arr = parameter로 받은 arr
   }
}

추상클래스

-추상 메소드를 포함하는 클래스

- Class에 abstract 제어자가 붙은 미완성인 클래스

      ※ abstract 키워드를 사용하여 정의하며, 다른 클래스들이 상속받아 사용할 수 있도록 설계

- 반드시 구현해야 하는 부분에 대해 명시적으로 표현

-추상 클래스 자체는 객체 생성 불가 (클래스를 인스턴스화 할 수 없다.)

-다중 상속 불가능 

 

추상클래스 특징 

-직접 인스턴스를 생성할 수 X

-하나 이상의 추상 메서드를 가지며, 메서드의 시그니처만을 정의하고 메서드 구현은 하위 클래스에서 구현

-일반적인 메서드를 가질 수 0 , 하위 클래스에서 필요에 따라 오버라이딩이 가능

-상속받은 하위 클래스는 추상 메서드를 반드시 구현해야함

-반드시 구현체가 필요

 

예제)

// 추상 클래스 ShapeDrawer
public abstract class ShapeDrawer {

		// 이 메소드는 공통으로 사용 가능
		public void printShape(int height) {
       for (int i = 0; i < height; i++) {
           System.out.print(makeALine(height, i));
       }
   }
  
   public abstract String makeALine(int h, int i);

}
// 추상 클래스 ShapeDrawer 상속(extends)
public class PyramidShapeDrawer extends ShapeDrawer{
   @Override
   public String makeALine(int h, int i) {
			 // 추상 클래스를 상속- 반드시 내부 추상메소드 구현 
       return String.format("%s%s\n", " ".repeat(h - i - 1), "*".repeat(2 * i + 1));
   }
}

 

DI(Dependency Injection)- 의존성 주입

 

-객체 지향 프로그래밍에 사용되는 설계 패턴 및 소프트웨어 개발 기술

-객체간 결합도 낮추기 위해 사용

-재사용 가능 코드 생성 0

 

 

예제)

DiEx  Class에서 ShapeDrawer를 사용(의존 Depends)

public class DiEx {
   private ShapeDrawer shapeDrawer;

   public DiEx(ShapeDrawer shapeDrawer) {
       this.shapeDrawer = shapeDrawer;
   }
  
   public void doSth() {
       shapeDrawer.printShape(5);
   }
}

 

 

728x90
반응형

'Java > Java' 카테고리의 다른 글

o(n2)의 시간복잡도 / 버블정렬 / 삽입정렬/선택정렬  (0) 2023.05.18
Collection-List Array/Generic/Constructor/Getter/Setter  (0) 2023.05.16
메소드  (0) 2023.05.09
소인수분해/ 최대 최소값  (0) 2023.05.06
홀수/ 약수/소수  (0) 2023.05.06