1. Single Responsibility Principle(단일 책임원칙)
    • 하나의 클래스는 하나의 책임만 가져야 한다
    • 하나의 책임이 모하 하기 때문에 클 수도, 작을 수도 있으며 문맥과 상황에 따라 다르다
    • 중요한 기준은 변경으로 변경 시에 파급효과가 적으면 단일 책임원칙을 잘 따른 것이다
  2. Open/Closed Principle(개방 폐쇄 원칙)
    • 소프트웨어 요소는 확장에는 열려있으나 변경에는 닫혀있어야 한다.
    • 다형성을 예로 들 수 있을 것 같다.
      • 인터페이스를 사용해서 기능을 구현한다면 확장에는 열려있지만 인터페이스 자체의 변경에는 닫혀있기 때문
      • 그것만으로는 해결이 불가능하기 때문에 별도의 연관관계를 맺어주는 별도의 조립, 설정 자기 필요함
  3. Liskov Substitution Principle(리스 코프 치환 원칙)
    • 프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다.
    • 다형성에서 하위 클래스는 인터페이스 규약을 다 지켜야 한다는 것, 다형성을 지원하기 위한 원칙, 인터페이스를 구현한 구현체는 믿고 사용하려면 이 원칙이 필요하다.
    • 단순히 컴파일 단계를 의미하는 것이 아님
  4. Interface Segregation Principle(인터페이스 분리 원칙)
    • 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다.
    • 인터페이스가 명확해지고, 대체 가능성이 높아짐
  5. Dependency Inversion Principle(의존관계 역전 원칙)
    • 프로그래머는 "추상화에 의존해야지, 구체화에 의존하면 안 된다." 의존성 주입은 이 원칙을 따르는 방법 중 하나.
    • 구현 클래스에 의존하는 게 아닌, 인터페이스에 의존하라는 뜻
    • 클라이언트가 구현 클래스를 직접 선택한다면 DIP를 위반한 것이다.

 

 

* 다형성 만으로는 OCP, DIP를 지킬 수 없다.(때문에 스프링을 사용)

'Back-end > JAVA' 카테고리의 다른 글

23. 예외 처리  (0) 2021.07.24
22. 추상클래스와 인터페이스  (0) 2021.07.24
21. Class - 상속  (0) 2021.07.24
20. Class - final(상수)  (0) 2021.07.24
19. Class - 멤버와 패키지, 접근 제한자  (0) 2021.07.24
  • 예외 처리
    • 프로그래밍에서 예외처리를 하는 것은 매우 중요하다
    • 예외란 에러, 오류 라고도 하며 프로그램이 동작할 때 이러한 예외 때문에 동작을 하지 않는 일이 생긴다
      • 버그와는 다르다. 버그는 오류없이 동작이 되지만 원하는 결과로 나오지 않는 것을 의미한다
  • 예외 종류
    • 일반 예외
      • 컴파일 단계에서의 에러이다
      • (개발 툴이 메모장이 아니라면) 코드를 작성할때 잘못 작성된 부분에 빨간색으로 밑줄이 생기는 것을 본 적이 있을 것이다. 이러한 에러들이 컴파일 단계에서 생기는 일반 예외이다.
      • 이러한 예외는 수정을 하지 않으면 실행기 불가능하다
    • 실행 예외
      • 런타임단계에서의 에러이다
      • 실행 줄 Null pointer exception 등이 흔하게 나타나는 에러로 컴파일 단계에서의 에러는 없지만 실행 시에 에러가 나오면서 프로그램이 종료된다
  • 예외처리 방법
    • try-catch
      • try {
        			
        } catch (Exception e) {
        
        } finally {
        			
        }
      • try : 오류가 날수도 있는 부분을 try괄호 안에 넣어준다
      • catch : try블럭에서 오류가 발생할 시에 catch에서 에러를 받아오며 에러를 어떻게 처리해줄지에 대해 코드를 작성해줄 수 있다
      • finally : 오류와 상관없이 무조건 실행이 되는 블럭이다
    • throws
      • try-catch는 코드를 try블록 안에 넣어서 오류가 생기면 즉시 처리를 해주기 위한 방법이다. 하지만 throws의 경우 다른 누군가에게 위임을 하겠다는 뜻으로 메서드의 이름 옆에 사용해줄 수 있다
      • 일반적으로는 try-catch를 써주는 것이 좋다

'Back-end > JAVA' 카테고리의 다른 글

객체 지향 설계의 5가지 원칙(SOLID)  (0) 2022.02.06
22. 추상클래스와 인터페이스  (0) 2021.07.24
21. Class - 상속  (0) 2021.07.24
20. Class - final(상수)  (0) 2021.07.24
19. Class - 멤버와 패키지, 접근 제한자  (0) 2021.07.24
  • 추상 클래스
    • 부모 클래스에 abstract키워드를 추가하면 추상 클래스를 선언할 수 있다
    • 추상 메서드를 정의해줘야 한다
      • 추상 메서드 : 메서드 내부의 동작을 정의하지 않고 리턴 타입, 매개변수, 메서드 이름만을 정해서 자식이 오버 라이딩해서 사용하도록 하는 메서드이다
    • 일반 메서드도 동시에 존재할 수 있다
    • 부모 클래스의 메서드가 동작할 필요가 없다면 추상적으로 이러한 매개변수를 받아와서 사용하면 된다 정도로 정의만 해주고 나머지 기능은 자식에게 위임하는 것이다
  • 인터페이스
    • 추상 메서드와 비슷하지만 모두 추상 메서드로 작성을 해야 된다는 것이 다르다
    • 최근에는 추상 메서드가 아닌 메서드도 인터페이스 내부에 작성이 가능하지만 일반적으로 작성하지 않는다
    • 필드에는 상수만 선언이 가능하다
    • 인터페이스의 경우 해당 인터페이스를 받아올 클래스가 implements키워드를 사용해서 구현을 할 수 있다
    • 인터페이스는 여러 개를 받아와서 구현이 가능한 것이 여러 특징 중 하나인데 자바에서는 다중 상속이 안되기 때문에 인터페이스를 통해서 다중 상속을 구현할 수도 있다

'Back-end > JAVA' 카테고리의 다른 글

객체 지향 설계의 5가지 원칙(SOLID)  (0) 2022.02.06
23. 예외 처리  (0) 2021.07.24
21. Class - 상속  (0) 2021.07.24
20. Class - final(상수)  (0) 2021.07.24
19. Class - 멤버와 패키지, 접근 제한자  (0) 2021.07.24
  • 상속
    • 부모 클래스의 멤버를 자식 클래스에게 물려줄 수 있다.
    • 자바에서는 다중상속이 불가능하다
      • 다중 상속이란 자식 클래스가 여러 개의 부모 클래스를 상속받는 것을 말한다
    • 중복되는 코드를 부모클래스에 만들어서 여러 명의 자식들이 상속받아 사용할 수 있기 때문에 유지보수에 용이하다
    • 객체 지향의 3대 요소중 하나이다
      • 객체지향의 3대 요소 : 상속, 다형성, 캡슐화
    • this가 자기 자신을 말한다면 부모를 가리키는 super라는 키워드도 사용이 가능하다
      • super : 자식클래스에서 부모를 가리킬 때 쓰는 키워드이다
    • class child extends parent {}
    • extends 키워드를 사용해서 부모를 상속받아 올 수 있다
    • 오버 라이딩
      • 부모 클래스가 가지고 있는 메서드를 재정의하는 것이다
      • 접근 제한자를 더 좁게 줄이는 것은 불가능하다
        • ex > 부모 public / 자식 protected 불가능
      • 동일한 이름을 가져야 하며 부모 클래스가 정의한 메서드와 리턴타입, 메소드 이름, 매개변수 목록이 같아야 한다
      • 내부적으로 동작하는 부분만 수정이 가능하다
    • final class : 상속 불가능
    • final method : 재정의 불가능
  • 다형성
    • 사용방법은 동일하지만 다양한 객체를 이용해서 다양한 실행결과가 나오도록 하는 성질을 의미한다
    • animal을 상속받은 개와 고양이가 sound라는 메서드를 재정의했고 그 결과 각각 다른 소리를 출력하게 된다
    • 이처럼 하나의 메서드로 다른 결과가 나오게 만드는 것을 다형성이라고 한다
  • 자동 타입 변환
    • 위의 코드에서 test부분을 보면 개와 고양이가 인스턴스를 생성했을 때 담아주는 변수의 타입이 부모 타입인 것을 확인할 수 있다.
    • 기본 타입 변수의 자동 형 변환을 생각해보면 int를 double에 담아주는 것이 가능하다. int의 범위보다 double의 범위가 더 넓기 때문에 가능한 것인데 클래스에서도 부모의 범위가 더 넓기 때문에 부모를 상속받은 자식 타입은 모두 부모 밑으로 들어갈 수 있는 것이다.

'Back-end > JAVA' 카테고리의 다른 글

23. 예외 처리  (0) 2021.07.24
22. 추상클래스와 인터페이스  (0) 2021.07.24
20. Class - final(상수)  (0) 2021.07.24
19. Class - 멤버와 패키지, 접근 제한자  (0) 2021.07.24
18. Class - Method(메서드)  (0) 2021.07.24
  • final(상수)
    • final키워드를 사용하면 상수로 정의를 할 수 있다
    • 상수란 변하지 않는 수를 의미하며 무조건 선언과 동시에 초기화를 해줘야 한다
    • public static final int age = 20;
    • 재할당을 하려고 코드를 짜면 에러가 생길 것이다

 

'Back-end > JAVA' 카테고리의 다른 글

22. 추상클래스와 인터페이스  (0) 2021.07.24
21. Class - 상속  (0) 2021.07.24
19. Class - 멤버와 패키지, 접근 제한자  (0) 2021.07.24
18. Class - Method(메서드)  (0) 2021.07.24
17. Class - Constructor(생성자)  (0) 2021.07.24
  • 멤버
    • 인스턴스 멤버 : 객체마다 가지고 있는 멤버를 의미한다
    • 정적 맴버 : 클래스가 가지고 있는 멤버로 모든 인스턴스가 공유한다
      • 정적 멤버를 선언해주는 방법은 static키워드를 사용해주면 된다
    • 고객은 은행이라는 클래스를 통해 각자의 계좌를 만들 수 있는데 이때 계좌가 인스턴스 멤버가 되는 것이다.
    • 이 계좌는 인스턴스 필드, 계좌이체를 하는 동작은 인스턴스 메서드이다.
    • 하지만 두 명의 고객 모두 은행의 고객센터 번호를 동일하게 공유하며 고객센터의 번호가 4567로 바뀐다면 바뀐 번호를 두명의 고객 모두 인지할 수 있다. 이때 고객센터 번호가 정적 멤버가 되는 것이다.
    • 코드로 살펴보자
    • public class BankTest {
      	public static void main(String[] args) {
      		Bank customer1 = new Bank();
      		Bank customer2 = new Bank();
      		
      		System.out.println(customer1.tel == customer2.tel);
              
              customer1.tel = "4321-4321";
              
              System.out.println(customer1.tel == customer2.tel);
      	}
      }
      
      class Bank {
      	String account;
      	int balance;
      	static String tel = "1234-1234";
      }
    • static으로 선언해준 tel이라는 변수는 customer1과 customer2가 모두 동일한 값으로 공유하기 때문에 true가 나올 것이다.
    • 또한 customer1이 tel의 번호를 바꿨다. 후에 밑에서 다시 비교를 해주는데 이때도 결과는 true이다.
  • 패키지
    • 단순하게 폴더의 기능만 하는 것이 아니라 클래스의 일부분으로, 클래스를 유일하게 만들어준다
    • 같은 패키지안에 같은 이름의 클래스는 존재할 수 없다
    • 작명은 일반적으로 주소 값을 거꾸로 써주는 형식으로 폴더명을 작성해 준다
      • ex > com.tistory.projectName
    • java로 시작하는 패키지는 자바 표준 api에서만 사용하므로 사용할 수 없다
  • 접근 제한자
    • public : 다른 패키지에서도 접근이 가능하다.
    • protected : 같은 패키지 또는 다른 패키지라 하더라도 상속을 받았다면 사용이 가능하다
    • default : 같은 패키지에서만 사용이 가능하며 default는 써주는 것이 아니라 접근 제한자를 안 써주면 자동으로 default가 된다
    • private : 클래스 내부에서만 사용이 가능하다.
    • 개방성은 적은 순서대로 public > protected > default > private가 된다

'Back-end > JAVA' 카테고리의 다른 글

21. Class - 상속  (0) 2021.07.24
20. Class - final(상수)  (0) 2021.07.24
18. Class - Method(메서드)  (0) 2021.07.24
17. Class - Constructor(생성자)  (0) 2021.07.24
16. Class - Field(필드)  (0) 2021.06.23
  • Method(메서드)
    • public class Student {
      	public int modifyStudent() {
          	return 0;
          }
      }
    • 생성자와 비슷하게 생겼지만 리턴 타입이 있고 클래스 이름과 동일한 것이 아닌 작동에 대해 작명을 해줘야 한다
    • 메서드란 어떠한 동작을 한다고 생각을 해보면 좋을듯 하다.
    • 메서드는 재료를 받아서 내부적으로 어떠한 동작을 하고 결과물을 반환해준다
    • 위의 그림처럼 쌀, 밥솥, 물이라는 재료를 밥 짓기라는 메서드에 넣어주면 쌀밥이 나온다. 여기서 쌀, 밥솥, 물은 매개변수이고, 밥 짓기는 매소드 내부에서 쌀, 밥솥, 물이라는 매개변수를 사용해서 쌀밥이라는 결과물을 내기 위한 동작을 실행하는 부분이며, 쌀밥은 리턴 값이 된며 리턴 타입은 밥이 되는 것이다.
    • 리턴 값과 리턴타입의 관계를 보면 쌀밥은 밥이라는 큰 카테고리 안에 들어갈 수 있다. 매개변수로 쌀이 아니라 보리를 넣는다면 보리밥이 나오지만 밥이라는 큰 카테고리는 같다.
  • 매개변수와 리턴값
    • 경우의 수는 4가지가 있다
      1. 매개변수가 있고 리턴 값이 없는 경우
      2. 매개변수가 있고 리턴 값이 있는 경우
      3. 매개변수가 없고 리턴 값이 없는 경우
      4. 매개변수가 없고 리턴 값이 없는 경우
    • 이렇게 4가지의 경우가 있다
    • 리턴 값에는 여러 가지가 올 수 있다. 너무 다양하고 많지만 몇 가지 예시를 들자면
      • void : 리턴 값이 없는 경우 사용된다
      • int, double, char, byte, boolean 등 기본 타입 : 기본 타입의 값을 리턴해줄 수 있다
      • String, List, 객체 등 참조 타입 : 객체, 클래스 등 모든 참조 타입으로도 반환이 가능하다
    • 매개변수를 받아와야 하는데 메서드를 작성하는 시점에 몇 개의 매개변수를 받아와야 할지 모르는 경우 혹은 계속 개수의 변경이 있어야 한다면 배열로 받아올 수도 있다
  • 메서드 오버 로딩
    • 오버 로딩 방법은 생성자와 같으며 리턴 타입의 변경은 의미가 없다
  • 메서드의 호출
    • 해당 클래스를 통해 인스턴스를 생성해주고 생성된 인스턴스를 통해서 메서드를 호출해준다
    • public class StudentTest {
      	public static void main(String[] args) {
      		Student s1 = new Student("홍길동", 90, 89);
      		
      		int s1Score = s1.getTotalScore();
      	}
      }
      
      class Student {
      	public String name;
      	public int korScore;
      	public int engScore;
      
      	
      	public Student(String name, int korScore, int engScore) {
      		this.name = name;
      		this.korScore = korScore;
      		this.engScore = engScore;
      	}
      
      
      	public int getTotalScore() {
      		return korScore + engScore;
      	}
      }
    • 메서드를 호출해서 리턴 타입에 맞는 변수에 저장해서 사용이 가능하다

'Back-end > JAVA' 카테고리의 다른 글

20. Class - final(상수)  (0) 2021.07.24
19. Class - 멤버와 패키지, 접근 제한자  (0) 2021.07.24
17. Class - Constructor(생성자)  (0) 2021.07.24
16. Class - Field(필드)  (0) 2021.06.23
15. Class - 객체와 클래스  (0) 2021.06.22
  • Constructor(생성자)
    • 객체 생성 시에 초기화를 담당한다
    • new연산자로 호출되는 중괄호 블록이다
    • 클래스 이름과 생성자의 이름은 동일해야 한다
    • 생성자가 하나라도 있으면 Default생성자는 컴파일 단계에서 자동으로 생성되지 않으며 Default생성자가 필요하다면 생성자 오버 로딩을 통해 Default생성자를 생성해줘야 사용이 가능하다
    • public class Student {
      	public Student() {
          	
          }
      }
    • 객체 생성 시 사용하는 new연산자에서 소괄호 안에 넣어줄 매개 변수를 생성자에서 설정해 줄 수 있다
    • 생성자를 작성하지 않으면 컴파일 시에 default생성자가 만들어지며 위의 코드와 똑같이 만들어진다
    • 메서드와 동일하게 생겼지만 반환 값이 없고 클래스 이름과 동일한 것이 특징이다
    • 생성자를 여러 개 생성할수 있다
      • 생성자를 여러개 만들어주는 것을 생성자 오버 로딩이라고 하며 매개변수의 타입, 개수 또는 타입과 개수가 모두 다른경우 오버로딩이 가능하다
      • 불가능한 경우
        • public class Student {
          	public int num;
              public String name;
              public int age;
              public int regNo;
              
          	public Student (int num, int age) {
              	this.num = num;
                  this.age = age;
              }
              
              public Student (int num, int regNo) {
              	this.num = num;
                  this.regNo = regNo;
              }
          }
        • 위와 같이 매개변수에 들어가는 값의 개수가 같을 때 같은 타입이면 오류가 생긴다
        • 오버 로딩 시에는 매개변수의 변수명은 중요하지 않으며 타입과 개수가 다른 것이 중요하다
      • 가능한 경우
        • public class Student {
          	public int num;
              public String name;
              public int age;
              public int regNo;
              
          	public Student (int num, int age) {
              	this.num = num;
                  this.age = age;
              }
              
              public Student (int num, String name) {
              	this.num = num;
                  this.name = name;
              }
          }
        • 위의 경우에는 매개변수의 개수는 같지만 타입이 다르기 때문에 오버 로딩이 가능하다
    • this
      • 위의 코드를 보면 모두 생성자 안에서 this라는 키워드를 사용해줬는데 자기 자신을 뜻한다
      • 생성자를 보면 매개변수로 받아오는 변수의 이름이 필드의 변수 이름이랑 같다. 일반적으로 위와 같이 작성을 해주는데 그때 필드가 가지고 있는 변수와 매개변수로 받아오는 변수를 구분해주기 위해 this라는 키워드를 사용할 수 있다.
      • this는 생성된 인스턴스 자신을 가리키는 키워드로 Student클래스로 A와 B라는 인스턴스를 생성했을 때 A의 this는 A가 가지고 있는 필드와 메서드, 생성자를 가리키고, B의 this는 B가 가지고있는 필드와 메서드, 생성자를 가리킨다.

+ Recent posts