1~2 교시
**Method Overloading (메소드 중복 정의)
=> 하나의 클래스에 메소드 이름은 같고 매개변수의 개수나 자료형이 다른 메소드가 존재하는 경우
=> 메소드를 호출할 때 대입한 매개변수를 보고 실행할 메소드를 결정한다.
=> 용어를 기억 - 최근에는 잘 사용되지 않는데 예전 개발자들이 중요하게 생각했던 개념이라서
Method Overriding 과 같이 자주 물어보는 질문 중의 하나
3 교시
**매개변수 전달 방법
=> 데이터의 분류에서 기본형(데이터가 1개)과 참조형(데이터가 0개 이상인 경우)
=> 메소드의 매개변수로 기본형을 전달하면 메소드 안에서 매개변수의 데이터를 변경해도 전달한 데이터는 변경되지 않는다. - call by value
=> 참조형을 전달햇는데 참조형 내부의 데이터를 변경하면 전달한 데이터도 변경이 된다. - call by reference
=> 메소드의 매개변수로 배열이나 인스턴스를 대입하는 경우에는 대입한 배열이나 인스턴스의 내용이 변경 가능성이 있다.
하나의 값(boolean, byte, short, char, int, long, float, double)은 메소드의 매개변수로 대입하면 절대로 값이 변경되지 않는다.
static 이 있으면 인스턴스를 만들 필요없다.
4 교시
** Recursion (재귀 호출)
=> 메소드가 자기 자신을 다시 호출해서 리턴
=> 알고리즘을 구현할 때 코드를 간결하게 만들고 이해하기 쉽게 작성할 수 있어서 이용
=> 메소드가 수행이 종료되기 전에 다시 메소드를 호출하기 때문에 메모리 사용량이 늘어나고 수행속도가 느려진다.
구현할 때 주의할 점은 종료 시점을 명확하게 만들어 주어야 한다는 것이다.
1-100까지 재귀를 이용하지 않고 구현
재귀를 이용한 1-n까지 합계
5 교시
==> fibonacci 수열
1,1,2,3,5,8,13,12,34,55,89...
첫번째 와 두번째 항은 무조건 1
세번재 항부터는 이전 2개 항의 합으로 구한다.
f(n) = f(n-1) + f(n-2) 단 n >=3
새로운 데이터를 만들 때는 가장 최근의 데이터를 이용
검색에 이용하기도 하고 금융분야에서 많이 사용
피보나치 수열을 코드로 구현하는 건 생각보다 쉽지 않다.
재귀를 이용하지 않은 경우
=> 재귀 구현
public 리턴타입 메소드이름(매개변수) {
if (중단조건) {
return 리터럴 이나 상수
}else{
return 메소드이름(매개변수 변경..);
}
결과는 같은 데 뭐가 더 좋은 걸까?
재귀로 구현하면 어려운 피보나치 수열도 쉽게 표현할 수 있다.
그렇지만 숫자가 커질 경우 재귀로 하면 메모리를 많이 잡아먹기 때문에 느리다.
=> n번째 피보나치 수열까지의 합
1->1
2->2
3->4
4->7
5->12
=> 금융분야 코딩테스트 하러 갈때는 피보나치 수열을 구현할 수 있도록 준비를 해서 가야한다.
**Constructor(생성자)
=> 인스턴스를 생성할 때 호출하는 특별한 메소드
1. 규칙
=> 이름은 반드시 클래스 이름으로 만들어야한다.
=> 클래스 안에 만들지 않아도 자신의 상위 클래스 생성자를 호출하는 매개변수가 없는 생성자가 1개 제공된다.
=> 생성자를 직접 만들면 자동으로 만들어지는 생성자는 소멸된다.
=> 생성자는 리턴 타입이 없다.
=> 생성자도 Overloading(메소드 이름은 같고 매개변수의 개수나 자료형이 다른 경우) 가능
=> 생성자는 new를 이용해서 호출해야 하고 생성자는 heap에 메모리 할당을 한 후 그 참조를 리턴한다.
=>인스턴스 생성
클래스이름 인스턴스이름 = new 생성자(매개변수);
=> 생성자를 정의하는 목적은 대부분의 경우는 프로퍼티의 값을 특정한 값으로 설정하거나 매개변수로 대입받아서 초기화하는 용도인데 드물게 인스턴스가 만들어질 때 다른 작업을 수행하도록 하기 위해서도 생성한다.
생성자 오버로딩
2. 클래스 확인
=> 생성자 종류만큼 인스턴스 생성하는 방법이 제공
=> 생성자의 종류가 10개이면 인스턴스를 만드는 방법도 10가지이다.
=> 클래스의 메소드를 사용하고자 하는 경우 인스턴스를 만들어야 하는 상황이면 생성자(Constructor)를 확인해야한다.
=> 생성자의 역할이 대부분의 경우 프로퍼티를 초기화하는 것인데 문서에서는 초기화를 initialize라고 한다.
3. 초기화 블럭
1) static 초기화 블럭
static{
내용;
}
=> 이 내용은 클래스가 처음 불러질 때 한 번만 수행한다.
2) 일반 초기화 블럭
{
내용;
}
=> 이 내용은 인스턴스를 만들 때 마다 수행된다.
3) 주의사항
=> static 초기화블럭에서는 static 변수와 지역변수만 사용이 가능하다.
=> 인스턴스가 소유하는 프로퍼티는 클래스가 만들어지고 난 다음에 생성이 가능하기 때문에 static 초기화 블러깅 만들어 질 때는 인스턴스가 없다.
=> 초기화 작업을 할 때 생성자 대신에 초기화 블럭을 이용해도 된다.
처음 한 번만 수행되는 이걸 어따가 써먹어야 할까?
** 인스턴스 배열과 일련번호 만들기
1. 인스턴스 배열
=> 동일한 자료형의 데이터가 여러개 있고 이 데이터들이 비교가능하다면 배열이나 List를 이용해서 하나로 묵어야 한다.
데이터 1개로 구성된 배열은 new를 이용해서 개수만 설정하면 자동으로 초기화 된다.
데이터 1개로 구성되지 않은 배열(인스턴스의 배열)을 만들어야 하는 경우에는 처음 메모리 할당을 하면 전부 null로 초기화가 된다.
이런 경우에는 메모리 할당을 하고 각각에 생성자를 호출해서 인스턴스를 대입해 주어야 한다.
String [] ar = new String[3]; //String 3개의 참조를 저장할 수 있는 배열을 생성
//String은 없다. 전부 null 이다
//각각에 생성자를 호출해서 인스턴스를 대입해야 한다.
ar[0] = new String("Java");
//처음 만들 때 생성자를 호출
String temp = new String("Jello:);
String [] br = {new String("Hi"), temp};
2. 일련번호(Sequence, Auto_Increnent)
=> 일정한 간격으로 자동 증가하는 숫자열
=> static 변수와 프로퍼티 그리고 생성자를 이용
=> static 변수를 1씩 증가시키면서 프로퍼티에 대입하면 된다.
연습문제 별찍기
***
**
*
**
***
//전부 5줄
//3번째 줄을기준으로 규칙이 변경
//각 줄은 공백과 별을 함께 출력
for(int i=0; i<5; i=i+1) {
if(i<3) {
//공백 : 0, 1, 2개
for(int j=0; j<i; j=j+1) {
System.out.print(" ");
}
//* : 3, 2, 1개
for(int j=0; j<3-i; j=j+1)
System.out.print("*");
}else {
//공백 ; 1, 0
for (int j=0; j < 4-i ;j=j+1) {
System.out.print(" ");
}
//* : 2,3
for(int j=0; j<i-1; j=j+1) {
System.out.print("*");
}
}
System.out.print("\n");
}
}
import java.util.Scanner;
public class Practice {
public static void main(String[] args) {
//년월일을 입력받아서 무슨 요일인지 출력
Scanner sc = new Scanner(System.in);
//년월일 입력받기
System.out.print("년도 입력:");
int year = sc.nextInt();
System.out.print("월 입력:");
int month = sc.nextInt();
System.out.print("일 입력:");
int day = sc.nextInt();
sc.close();
//입력받은 년도 이전까지 지나온 날들을 전부 더합니다.
int tot = 0;
//윤년이면 366을 더하고 그렇지 않으면 365를 더합니다.
for(int i=1; i<year; i=i+1) {
if(i%4==0 && i%100!=0 || i%400==0) {
tot = tot + 366;
}else {
tot = tot + 365;
}
}
//각 월의 날짜 수를 갖는 배열을 생성
int [] nalsu = {
0, 31, 28, 31, 30, 31, 30,
31, 31, 30, 31, 30, 31};
//입력한 년도가 윤년이면 2월은 29일 까지
if(year%4==0 && year%100!=0 || year%400==0) {
nalsu[2] = 29;
}
//입력한 월 이전 까지의 날 수를 전부 더합니다.
for(int i=0; i<month; i=i+1) {
tot = tot + nalsu[i];
}
//입력받은 일을 더함
tot = tot + day;
//요일은 7번마다 1번씩 돌아오므로 7로 나눈 나머지 계산
int result = tot % 7;
System.out.println(result);
'Java' 카테고리의 다른 글
11일차 공부 Nested 클래스, 내부 클래스, singleton (0) | 2020.04.21 |
---|---|
10일차 공부 GarbageCollection, 패키지&임포트, 상속, super, Method Overriding, abstract, Interface, default method (0) | 2020.04.20 |
8일차 공부 Class, Instance, 접근지정자, static변수, 메소드, this, getters and setters, static 메소드, (0) | 2020.04.15 |
Git Hub 이용법 (0) | 2020.04.14 |
7일차 공부 Array, 평균, 최소값, 최대값, 구구단, 서식 (0) | 2020.04.14 |