[20230713] 클라우드 플랫폼 기반 웹서비스 개발자 양성 과정 6일차.

양희정·2023년 7월 13일
0

오늘의 과정 목록

  • 객체지향 프로그래밍의 핵심, 클래스와 객체
    (오버로딩, 생성자, this)
  • 에러와 예외

오버로딩

같은 이름의 메서드를 여러 개 생성할 수 있도록 하며 매개 변수의 유형과 개수를 다르게 하는 방법을 의미한다.

  • 오버로딩 조건
    같은 이름의 메서드를 만들기 때문에 이름이 같아야 한다.
    매개 변수의 조합이 달라야 한다. (매개변수의 이름은 영향을 미치치 않는다)
    반환 타입만 다를 경우 오버로딩이 성립하지 않는다.
    같은 클래스 내에서만 발생한다.

  • 장점
    객체지향의 특성 중 하나인 다형성을 지원하여 하나의 메서드로 다양하게 표현할 수 있다.
    코드 유지 관리가 용이하여 메서드명을 작성할 때 고민하지 않아도 된다.

	
	double purchase(int productPrice) {
		double sum =  productPrice * 1.1;
		return sum;
	}
    
	double purchase(int product1Price, int product2Price) {
		double sum = (product1Price + product2Price) * 1.1;
		return sum;
	}
	
	double purchase(double product1Price, int product2Price) {
		double sum = (product1Price + product2Price) * 1.1;
		return sum;
	}

	double purchase(double product1Price, double product2Price) {
		double sum = (product1Price + product2Price) * 1.1;
		return sum;
	}

위와 같이 오버로딩을 통해 하나의 이름으로 다양한 코드들을 작성할 수 있다.

 	/* 오류 발생 1)
    매개 변수의 이름만 바꿨기 때문에 오류가 발생했다.
    매개 변수의 이름은 오버로드에 영향을 미치치 않는다.
	double purchase(int Price) {
		double sum =  Price * 1.1;
		return sum;
	}
	// 오류 : Duplicate method purchase(int) in type Overloading
    */
    
    /* 오류 발생 2)
    반환 타입은 오버로딩에 영향을 미치지 않는다.
	int purchase(int productPrice) {
		int sum =  (int) (productPrice * 1.1);
		return sum;
	}
	 오류 : Duplicate method purchase(int) in type Overloading
    */
    
    // * 데이터 타입, 순서가 중요하게 작용한다 * //

메서드의 매개 변수가 많아질때의 문제가 생긴다.
코드 상으로는 문제가 되지 않지만 매개 변수가 많아 실수로 잘못 입력하면 원하는 값이 들어가지 않기 때문에 번거로움이 생긴다.

	// 학생 : 학번, 이름, 나이, 전화번호, 수업, 성적
	static void  studentInfoPrint(
		String studentNumber,  String name, int age, String telNumber, String course, String grade
	) {
		System.out.println("학번 : " + studentNumber);
		System.out.println("이름 : " + name);
		System.out.println("나이 : " + age);
		System.out.println("전화번호 : " + telNumber);
		System.out.println("수업 : " + course);
		System.out.println("성적 : " + grade);
	}
    	public static void main(String[] args) {
		studentInfoPrint("123456", "김철수", 30, "010-222-3333", "A++", "경영학원론"); 
/*
출력 결과)
학번 : 123456
이름 : 김철수
나이 : 30
전화번호 : 010-222-3333
수업 : A++
성적 : 경영학원론
*/
  • DTO
    매개 변수를 하나의 묶음으로 만든다.
    클래스로 묶어 객채로 만들어 사용한다.
    Dto를 활용하면 매개 변수의 순서에 어떤 것을 넣을지 헷갈리지 않는다.
    데이터를 직접적으로 확인이 가능하다.

class Dto { 
	String studentNumber;  
	String name; 
	int age;
	String telNumber;
	String course;
	String grade;
}

// Dto 타입의 변수 명은 dto
static void  studentInfoPrint(Dto dto) { 
			System.out.println("학번 : " + dto.studentNumber);
			System.out.println("이름 : " + dto.name);
			System.out.println("나이 : " + dto.age);
			System.out.println("전화번호 : " + dto.telNumber);
			System.out.println("수업 : " + dto.course);
			System.out.println("성적 : " + dto.grade);
		}

	public static void main(String[] args) {

			// Dto 인스턴스 생성 및 초기화. // new Dto() -> 생성자.
            Dto dto = new Dto(); 
            
			// 필드에 맞춰 값을 넣음.
            dto.studentNumber  = "456789"; 
			dto.name = "김영희";
			dto.age = 30;
			dto.telNumber = "010-4444-5555";
			dto.course = "경영학원론";
			dto.grade = "A+";
			studentInfoPrint(dto);
	}
    
/*
출력 결과)
학번 : 456789
이름 : 김영희
나이 : 30
전화번호 : 010-4444-5555
수업 : 경영학원론
성적 : A+
*/

생성자

클래스로의 인스턴스를 생성할 때 호출하는 메서드이다.
생성자의 이름은 클래스의 이름과 동일하고 반환 타입을 지정하지 않는다.

class Dog{
	String breed;
	String name;
	int age;
	
	Dog() {
		breed = "진돗개";
		name = "누렁이";
		age = 1;
		System.out.println("Dog 인스턴스 생성!");
	}
	Dog(String arg1, String arg2, int arg3) {
		breed = arg1;
		name = arg2;
		age = arg3;
	}
public class Constructor {
	public static void main(String[] args) {
		// dog1.Dog(); 생성할 때만 사용할 수 있는 메서드이다.
		// 생성자가 아무것도 없으면 자동으로 만들 수 있지만 dog3번과 같은 경우에는 쓸수가 없다.
		Dog dog1 = new Dog();
		Dog dog2 = new Dog();
        // 생성할 때 그 값을 바로 지정할 수 있다. 
		Dog dog3 = new Dog("포메라니안", "봄", 8); 
		

에러와 예외

  • 에러 (Error)
    시스템 레벨에서 발생하는 심각한 문제를 나타낸다.
    프로그램이나 시스템에서 복구할 수 없는 상태를 나타내며, 이는 주로 JVM 내부의 문제나 리소스 부족 등과 같은 심각한 시스템 수준의 이슈에서 발생한다.
    개발자가 처리할 수 있는 문제가 아니다.

에러
(컴파일에러, 코드라인에 빨간 줄(문법, 오타, 타입))

런타임에러
실행중일 때 발생

로직에러
실행되는 에러.
예상치못한 결과가 나온다.

  • 예외
    프로그램 실행중에 발생할 수 있는 예상치 못한 상황을 말한다.
    외부에서 데이터를 받아오거나 혹은 사용자의 조작이 포함되어있을 때 발생한다.
    코드 상으로는 문제가 없지만 int값으로 지정한 코드를 String 값을 넣었을때 발생하는 결과를 예로 들 수 있다.
		Scanner scanner = new Scanner(System.in);
		
        int number = scanner.nextInt();
        System.out.println(number);
        /*
        예외 상황)
        int 값으로 지정한 number을 사용자가 문자로 입력했을 때 예외가 발생.
        예외 코드)
        Exception in thread "main" java.util.InputMismatchException
        */
        
        int[] numbers = new int[3];
		numbers[number] = 10;
        System.out.println(numbers[number]);
        /*
        예외 상황) 
        numbers 안에 있는 배열number 크기를 3으로 지정했기 때문에 0~2 사이의 숫자를 입력해야 한다.
        인덱스의 최대치는 2인데 10이 들어가 인덱스를 벗어난 값이 입력되었다.
        */
        
        예외 코드) 
        java.lang.ArrayIndexOutOfBoundsException:
        
        int result = 10 / number;
		System.out.println(result);
        /*
        예외 상황)
        0이 입력되어 0으로 나누는 상황이 발생
        예외 코드)
        Exception in thread "main" java.lang.ArithmeticException: / by zero 
        */
  • 예외 처리 방법
    어떠한 상황이 올지 모르니 예외 발생 비율이 높은 외부에서 접근하는 메소드를 try catch문을 사용해 try에 넣은 메소드가 예외가 발생했을 때 catch 코드를 실행한다.
    try { 예외가 발생할 수 있는 코드 }
    catch (예외클래스 매개변수명) { 예외가 발생했을 때 실행할 코드 }
    catch ...
    -> try는 무조건 하나이지만 catch는 여려개 작성이 가능하다.
		int number = 0;
		
		 catch (InputMismatchException exception) {
			System.out.println("정수만 입력할 수 있습니다.");
		} catch (ArrayIndexOutOfBoundsException exception) {
			System.out.println("인덱스 범위를 초과했습니다.");
		} 
		System.out.println("프로그램 정상 종료");

위 처럼 하나하나 예외 이름을 넣을 수 있지만 시간이 많이 걸리는 관계로 Exception를 넣어 간편화 할 수 있다.

        
		try {
			number = scanner.nextInt();
			System.out.println(number);
		} catch (Exception exception) { // Exception : 모든 예외
			System.out.println("입력이 정상적이지 않습니다.");
		}
        // 배열은 검증을 통해서 대처가 가능하기 때문에 굳이 try catch문에 넣지 않아도 된다.
		int[] numbers = new int[3]; 
		if (number <  3 && number >= 0) {
			numbers[number] = 10;
		}
        
		System.out.println("프로그램 정상 종료");
  • 주의사항
    되도록이면 예외가 오지 않는 상황을 만드는 방향으로 코드를 짤 수 밖에 없다.
    코드 성능이 굉장히 느려지기 때문에 모든 부분에서 할 필요는 없고 입력받는 행위를 할 때, 밖으로 나가는 행위를 할 때 사용하면 좋다.

0개의 댓글