오늘의 과정 목록
- 객체지향 프로그래밍의 핵심, 클래스와 객체
(오버로딩, 생성자, 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++
성적 : 경영학원론
*/
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);
에러와 예외
에러
(컴파일에러, 코드라인에 빨간 줄(문법, 오타, 타입))
런타임에러
실행중일 때 발생
로직에러
실행되는 에러.
예상치못한 결과가 나온다.
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
*/
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("프로그램 정상 종료");