여태 수업 전날은 늦게 잔 적이 없었는데 어제 생각보다 너무 늦게 자서
오전부터 졸음이 쏟아지는 불상사가 있었지만 그래도 꾸역꾸역 열심히 수업 듣기 @,.@
오늘 수업은 지난 수업내용을 복습하면서 클래스를 좀 더 세분화하여 각 멤버에 대해 깊게 배웠다!
클래스 생성과 클래스 멤버
어제 블로그를 작성하면서 필드, 생성자, 메소드에 대한 정의와 특징에 대해서는 기록하였다.
오늘 역시 필드, 생성자, 메소드를 갖는 클래스를 생성하여
외부 클래스의 메인메소드에서 호출하여 활용하는 코드를 작성해보면서
필드, 생성자, 메소드의 개념에 대해 확실하게 익힐 수 있었다.
클래스, 필드, 생성자, 메소드의 개념과 특징을 요약한 내용은 코드 내 참조로 작성해두었다.
일반적으로 생성자는 명사로 이름을 정하고, 메소드는 동사+명사로 이름을 정한다.
또한 메소드는 반드시 클래스 내/외부의 호출에 의해서 실행되어진다.
메소드 오버로딩
다음은 메소드 오버로딩에 대한 개념을 익혀보았다!
메소드 오버로딩은 클래스 내에 같은 이름의 메소드를 여러 개 선언하는 것을 뜻한다.
그러나 동일한 클래스 내에서 같은 이름의 메소드를 여러 개 선언하더라도 이것은 각 다른 메소드로 인식한다.
메소드 오버로딩1에서는 각 메소드의 이름을 다르게 선언하였고,
메소드 오버로딩2에서는 각 메소드의 이름을 add로 모두 동일하게 선언하였다.
메소드 오버로딩 후 메인메소드에서 add 메소드를 호출하여 실행하였을때
같은 이름의 메소드이지만 매개변수 타입이 모두 다른 메소드이기 때문에
매개변수 타입에 맞게 파라미터를 저장해주니 정상적으로 잘 실행되었다.
메소드 오버로딩은 매개변수의 타입과 타입의 순서, 매개변수의 갯수가 다르면 가능하고,
매개변수의 이름이나 반환타입과는 무관하다는 점을 기억해야한다.
같은 이름의 메소드를 여러 개 선언하여 매개변수의 이름을 바꾸거나 반환타입을 달리한다고해도
매개변수의 갯수와 타입이 같다면 중복 메소드로 인식하여 메인메소드에서 호출했을 때 오류가 발생한다는 것이다.
이런 경우에는 메소드의 이름을 각각 다르게 설정하여 활용할 수 있다.
생성자 오버로딩
메소드와 마찬가지로 생성자 오버로딩도 가능하다.
생성자 오버로딩은 동일한 클래스 내에서 매개변수의 타입, 갯수, 순서가 다른 생성자를 여러개 선언하는 것 이다.
(Line 9는 기본생성자이고, 다른 생성자들은 매개변수를 가진 생성자들이다.)
메소드 오버로딩과 동일하게 매개변수의 갯수, 타입과 순서가 같으면 오류가 발생한다.
메소드와 생성자 모두 오버로딩이 가능하다는 것,
매개변수의 타입, 갯수, 순서에 따라 다른 코드로 인식한다는 것을 기억해두고
오버로딩을 활용하는 여러가지 코드를 주말에 작성해 볼 것이다.
생성자(Constructor)
음.. 이건 그냥 기억해두면 유용하게 사용할 수 있는 정보이다.
자바에서는 단축키를 잘 활용하는 것이 시간을 단축하고, 올바른 코드를 입력하는 것에 도움이 된다.
Shift + alt + s 단축키를 눌러 Constructor Generated using Fields를 활용하면
내가 원하는 필드의 생성자를 자동으로 완성해주어서 훨씬 간편하다.
this() 메소드
다음은 생성자에서 사용되는 this() 메소드이다.
참고로 this() 메소드는 생성자에서만 사용할 수 있고, 메소드에서는 사용이 불가능하다.
다른 생성자를 호출할 때 사용되는 메소드이고, 중복코드를 정리하는 데에 유용하게 사용된다!
코드를 보면서 정리하면 이해가 훨씬 쉽다.
먼저 기본생성자에서 Line10과 같이 this() 메소드로 다른 메소드를 호출한다.
this() 메소드에 입력된 파라미터가 String 타입의 변수 1개이므
이와 같은 형태의 매개변수가 1개인 생성자를 찾아 Line 15의 다른 생성자에 실행한다.
Line 15의 생성자는 또 다시 model, String 타입, int 타입의 파라미터를 this() 메소드로 호출하고 있으므로
같은 형태의 매개변수가 3개인 생성자를 찾아 Line 25의 다른 생성자를 실행하는 것이다.
그러면 최종적으로 메인메소드에서 새로운 Car 객체를 생성하여 print 생성자를 호출해 출력해주면
Line10에서 model에 "그랜저", Line 17에서의 color에 "은색", maxSpeed에 250의 값이
Line 25의 다른 생성자에서 저장되어 파라미터가 없는 company를 제외한 모든 정보를 정상적으로 출력한다.
이때 각 생성자 내에서 this() 메소드를 가장 첫 줄에 입력해야하고,
줄 공백을 제외하고 선행되는 실행문이 있으면 오류가 발생하니 주의해야한다.
return
그리고 다음은 생성자에서 메소드 실행을 중지시키고 값을 반환해주는 return문이다!
반환해야하는 값이 있다면 반드시 return문으로 값을 반환해주어야 하고,
return문에서 메소드 실행이 중지되기 때문에 return문 뒤에는 실행문이 올 수 없다.
또한 반환값이 없는 메소드에서는 return문을 사용해 메소드를 강제로 종료시키는 역할을 한다.
반환되는 값은 plus 메소드의 Line 19처럼 연산식을 넣어 결과값을 반환해도 되고,
divide 메소드의 Line 27-28처럼 변수에 연산 결과를 저장하여 변수에 저장된 값을 반환해주어도 된다.
배열과 가변인자 매개변수
배열과 가변인자를 매개변수로 갖는 메소드의 활용도 가능하다.
배열을 매개변수로 갖는 메소드와 가변인자를 매개변수로 갖는 메소드는
동일한 이름으로 생성하였을 때 중복 메소드로 인식되니 주의하자!
그리고 배열과 가변인자의 차이점에 대해서만 구분해서 알아두면 좋을 것 같다 :)
배열을 매개변수로 갖는 메소드의 경우 새로운 배열 객체를 생성할 때 저장되는 인자들에 대해 메소드를 실행하지만
가변인자를 매개변수로 갖는 메소드의 경우에는 호출하면서 입력되는 인자들을 컴파일 시점에 배열로 정의하기 때문에
인자의 갯수 제한없이 원하는 파라미터 값을 입력하여 저장하고 활용할 수 있다.
동일한 클래스 내에서 메소드끼리의 호출을 활용해 본 예시이다.
메인메소드에서 executeAvg 메소드를 호출하여 파라미터를 입력해주면 Calulator 메소드에서 executeAvg가 실행되고,
해당 메소드 내에서 avg 메소드를 호출하여 avg 메소드가 실행되는데, avg메소드내에서 다시 plus 메소드를 호출하여
plus 메소드에서 x+y의 값을 다시 avg 메소드로, avg에서 다시 x + y /2.0의 값을 executeAvg로 보내준 다음
excuteAvg에서 print 메소드를 실행하여 println 메소드에서 실행문을 출력하고 다시 executeAvg로 돌아와 실행문을 출력한 다음 실행결과를 메인메소드로 보내주어 콘솔창에서 최종 출력 결과를 확인할 수 있다.
CalculatorDemo 클래스 Line 8에서 executeAvg 메소드 호출 -> Calculator 클래스 Line 19의 executeAvg 메소드에 파라미터 저장 -> Line 20에서 avg 메소드호출 -> avg 메소드에서 파라미터 저장 -> Line 10에서 plus 메소드 호출 -> plus 메소드에서 파라미터 저장 -> Line 6에서 x+y값 반환 -> Line 10에서 x+y / 2.0 반환 -> Line 20에서 println 메소드 호출 및 실행 -> Line 15 실행 -> Line 16 실행 -> Line 22 실행 -> 출력
정사각형의 넓이, 직사각형의 넓이를 구하기 위해 같은 이름이지만 매개변수의 갯수가 다른 2개의 메소드를 생성하여
메소드 오버로딩을 활용한 예시를 코드로 작성해 본 것이다.
그리고 다음으로는 문자열을 숫자로 변환하여 계산기를 활용하는 코드이다.
매개변수의 타입이 다른 메소드 오버로딩을 통하여 add 메소드를 생성하고, add 메소드는 두 파라미터 값을 더하여 반환하도록 하고, String 타입의 문자는 Integer.parseInt() 메소드를 활용해 int 값의 숫자로 변환하여 반환하도록 하였다.
그런데 StringcalculatorEx 클래스의 Line 4와 같이 숫자로 변환할 수 없는 String 타입의 파라미터를 전달받았을 때
예외가 발생하는 것을 해결해주기 위해 try-catch문으로 NumberFormatException으로 예외처리를 해주어야한다.
이처럼 예외가 발생할 수 있는 구문은 try-catch문의 try 블록 안에 작성해 예외 처리를 해주어야
코드가 실행될 때 오류없이 올바르게 결과값을 출력할 수 있다 :)
Static
그리고 마지막 시간은 Static 과 non-Static 멤버에 대하여 비교해보는 시간을 가졌다.\
먼저 Static 메소드는 정적멤버인데, 모든 클래스에서 공통적으로 공유되는 메소드이며, 인스턴스 메소드가 아니다.
정적 멤버는 객체 내부가 아닌 메소드 영역에 존재하므로 객체를 생성하지않고, 클래스로 바로 접근해 활용이 가능하다.
Static 메소드를 호출할 때에는 클래스명.메소드명()으로 호출할 수 있고, 동일 클래스 내에서는 클래스명을 생략할 수 있다.
그에 비해 인스턴스 멤버는 non-Static(비정적) 멤버이고, 반드시 객체를 생성하여 메인메소드에서 호출되었을때만 실행되는 메소드이다. 인스턴스 메소드의 호출은 변수명.메소드명()으로 호출할 수 있다.
아직은 코드를 작성하고 읽어내는데에 미숙한 부분이 많아서
수업시간 외에도 공부하는 시간을 조금씩 더 늘려서 내 것으로 만들어야겠다는 생각이 들었다!
그리고 또 클래스, 멤버, 메소드, 생성자 등의 이름을 만들때도 그렇고,
오류나 예외 발생, 그 외 설명문 등 자바와 이클립스를 완벽 활용하기 위해서는
영어 공부도 꾸준히 병행해서 해야할 것 같다 :)
'Develop growth diary > JAVA' 카테고리의 다른 글
자바 기반 객체지향 프로그래밍 04 - 상속(Override - 접근제한자, super, toString) (0) | 2022.10.11 |
---|---|
자바 기반 객체지향 프로그래밍 03 - 정적 멤버, 접근제한자 (0) | 2022.10.07 |
자바 기반 객체지향 프로그래밍 01 - 객체 생성과 클래스 변수 (0) | 2022.10.05 |
자바 기반 구조적 프로그래밍 07 - 열거 타입 생성과 메소드 활용 (0) | 2022.10.05 |
자바 기반 구조적 프로그래밍 05 - 반복문과 배열의 생성 및 복사 (1) | 2022.10.04 |