[오늘 공부할 것들]
▷ static, final 키워드의 사용방법
▷ 메소드 오버로딩
▷ 생성자 오버로딩
[1교시]
[static과 final의 이해]
1) static
- ★객체를 따로 생성하지 않아도 바로 사용할 수 있는 메서드 혹은 값
보통 new라는 키워드가 없으면 메소드를 사용할 수 없음. static을 이용하면 메모리에 이미 올라가 있음. 그렇기에 static이 있으면 사용할 수 있음. 그러나 남발해서는 안된다. static이 붙은 변수는 우리 그룹, 우리멤버라고 부르지 않는다. static은 new를 하지 않아도(객체생성없이) 호출할 수 있는 것.
- ★멤버라고 하지 않고 클래스 수준의 데이터
- ★메서드 앞, 멤버필드 앞, 클래스 앞에 사용 가능
- ★static 메서드는 non-static에 접근 불가(접근지정자와 리턴타입 사이에 넣는다)
2) final (여기서 끝이니까 더 이상 값이 수정되지 않게! 값 변경 끝!)
- 값 변경 불가, 상속불가, 오버라이딩 불가
- 메서드 앞, 멤버필드 앞, 클래스 앞, 지역변수 앞에 사용 가능
3) 상수만들기
- 멤버필드 단에 존재하는 상수 앞에 public static final을 붙이게 되면 해당 값은 상수화된다.
- 네이밍 룰은 스네이크 표기법 사용. MY_DATA 전체 대문자와 "_"를 사용해 단어를 나눔.
클래스명 : 파스칼 표기법 MyClass
메소드명, 일반 변수 : 카멜 표기법 myData
: 헝가리언 표기법(타입을 씀, iNum, fValue) 지금은 사용하지 않음.
하나의 파일 안에 두 개이상의 클래스가 있을 경우, 파일명과 클래스가 동일한 클래스만 메인 메소드를 가질 수 있다.
파일 안에는 class MyStaticClass와 static이 있는 메인 메소드, 2개의 메소드가 있다. class MyStaticClass는 static이 없는 클래스이기 때문에 사용하기 위해선 객체를 생성해야 한다. 생성하기 전에는 위와 같이 오류가 발생한다.
객체 생성 후 모습
class MyStaticClass에 static 오류있으니까 다시 해보기
왜 여기서 에러가 나는지 모르겠다. 가끔 이런 경우가 있는데 속이 터진다. ㅠㅠ 맥북에서 할 때는 됨.. 이유를 찾지 못함.
컴공친구가 답해줌^^ static의 s를 대문자로 썼기때문이란다^^ ㅠㅠ
▶ add가 에러나는 이유는?
public int add(int a, int b)의 add를 사용하고 싶음. add 메소드는 non-statric 상태이기 때문에 사용하기위해 static을 넣어주거나 객체를 생성해야 한다. 화면 속의 Cannot make a static reference to the non-static method add(int, int): 스태틱이 아닌 메소드나 필드를 참조할 수 없다는 뜻. 따라서 모든 메소드나 필드를 static으로 만들거나 객체를 생성해야 한다는 뜻이다. (2가지 방법)
객체를 생성해야 한다고? okay! 그래서 내가 한 방법
진짜 웃기지도 않는다^^
메소드 int add가 아니라 StaticTest의 객체이거늘.. 민망하여라
주의하세요!
객체생성 => StaticTest st = new StaticTest();
그렇다면 객체를 생성하기!
StaticTest st = new StaticTest(); 객체를 생성한 다음 스캐너를 떠올려서
Scanner keyin = new Scanner(System.in);
int a;
a = scanner.nextInt();
스캐너에서 스캐너 메소드를 사용하는 것처럼 표현한다.
int result = add(10,20); ==> int result = st.add(10,20);
메소드를 사용하기 위해선!
s.value
Sample.MY_DATA
Math.E
와 같은 것들은 좌변에 대입할 수로 가져오는 것만 가능, 앞에 변수가 따로 있어야 한다.
같은 클래스의 경우에는 변수명만 써도 되지만 해당 클래스 바깥의 메소드를 가져오려면
값을 가져올 클래스명.메소드명(int, int) 이런식으로 입력해야 한다.
사실 이해를 못한 것 같다. int result = st.add(10, 20)인데 밑에는 왜 result =multiply(10,20)로 되는거지?
변수는 result 하나뿐 => 음. 변수 result를 선언해 메소드를 호출하고 그 이후에는 변수 result에 해당 메소드의 지역변수 대입한 것!
★여기서도 return에 다시 살펴보자!
열어보기 ↓
public class StaticClass {
public static void main(String[] args) {
//객체 생성
StaticClass st = new StaticClass();
//객체 생성 후 접근
int result = st.add(10, 20);
System.out.println(result);
}
public int add(int a, int b) {
return a + b;
}
}
: 메인 메소드에서 ① int result = st.add(10, 20); 메소드 호출, ② add 메소드에 가서 return a + b; 리턴값을 가지고 add 메소드를 호출한 int result = st.add(10, 20);로 돌아감.
[원의 면적, 넓이를 함수 Math를 이용해 구하라]
Math클래스 안에는 다양한 클래스가 많다.
s f => static final 상수화
double형인 area의 값을 소수점 이하를 버리는 floor를 사용함.
◆ floor와 ceil은 반대! 개념
floor 함수 : double형의 값을 넣으면 소수점을 버리고 값을 돌려주는 함수
ceil 함수 : double형의 소수점 값을 올리고 돌려주는 함수.
[2교시]
★final
final을 사용하면 초기화한 이후로 값을 수정할 수 없다.
선언과 초기화를 함께 하기를 추천!
로컬변수(지역변수) 안에는 static을 만들 수 없지만, final은 사용 가능하다.
final의 경우, 선언과 초기화를 한번에 하는 것을 추천!
하지만 따로 한 경우에는 final 변수를 선언한 이후 단 한번만 초기화하여 사용할 수 있다.
[final과 static final]
화면과 같이 삼각형(Package)의 F가 뜬다면 대입할 수 있는 값을 의미한다. 따로 변수가 있어야 한다.
그렇기 때문에 int a = s.value;
s.value
Sample.MY_DATA
Math.E
와 같은 것들은 좌변에 대입할 수로 가져오는 것만 가능, 앞에 변수가 따로 있어야 한다.
static final int MY_DATA = 30;
→ static final을 이용하면 메모리에 올라감과 동시에 값을 수정할 수 없는 상수화가 된다.
[메서드 오버로딩(Method Overloading)]
- 메소드 오버로딩이란?
: 메소드 이름은 같고, 매개변수를 달리해서(개수나 타입이 다름) 다른 메소드로 인식해 동작하도록 한 것.
:내부적으로 기능은 동일지만 단, 데이터가 다르다!
- 생성자 또한 오버로딩이 가능하다. (생성자도 메소드이기 때문에)
[오버로딩의 예]
메소드 add를 호출한 곳에 return 값을 가지고 간다!
[오버로딩의 예: 매개변수의 개수가 다를 경우]
이름은 add로 같지만 매개변수의 개수가 다르다.
값을 불러올 때 매개변수의 타입이나 개수로 알맞는 것을 가져옴.
하지만 add의 기능 "+"는 동일하다.
메소드 안의 연산자를 바꾸어도 사용 가능!
[오버로딩의 예- 매개변수의 타입이 다를 경우]
변수의 이름 짓는 것도 쉽지 않다.
주의! 데이터 타입과 개수가 맞지 않으면 오류가 뜬다.
System.out.println(add(15.5,10));의 경우, 데이터 타입에 맞게 세번째 메소드로 호출된다.
★오버로딩 : 메소드의 이름은 같지만 매개변수의 개수나 데이터타입을 변경해 다른 메소드처럼 같은 기능을 사용하는 것.
[생성자의 특징_생활코딩 참조]
- 값을 반환하지 않는다.
: 생성자는 인스턴스를 생성해주는 역할을 하는 특수한 메소드라고 할 수 있다. 그런데 반환 값이 있다면 엉뚱한 객체가 생성될 것이다. 따라서 반환값을 필요로 하는 작업에서는 생성자를 사용하지 않는다. 반환 값이 없기 때문에 return도 사용하지 않고, 반환 값을 메소드 정의에 포함시키지도 않는다.
- 생성자의 이름은 클래스의 이름과 동일하다.
: 자바에서 클래스의 이름과 동일한 메소드는 생성자로 사용하기로 약속되어 있다.
[생성자와 생성자를 오버로딩하는 이유]
: 매개변수가 있는 생성자가 있을 때는 컴퓨터가 자동으로 기본생성자를 만들어 주지 않는다. 따라서 왼쪽 예제에서는 존재하지 않는 생성자를 호출하고 있다. 이 문제를 해결하기 위해서는 오른쪽 예제와 같이 기본 생성자를 추가해줘야 한다.
클라스의 객체를 생성할 때 JVM에서 자동으로 기본 생성자를 만들어 준다. 하지만 생성자의 매개변수가 있는 경우에는 말이 다르다. 매개변수가 있는 생성자가 있는 경우에는 자동으로 기본 생성자를 만들어 주지 않는다. 그렇기 때문에 class Friend에는 기본생성자와 매개변수가 있는 생성자 2가지 모두 있는 것이다.
생성자 또한 메소드이기때문에 오버로딩 가능하다.
public Friend() {}
public Friend(String name, int age) {}
↑ 매개변수의 크기와 타입이 다른 경우
<5주차 질문 중 3번> 참고
Friend f랑 Friend2는 어떻게 출력하지?
sysout에 f2를 넣으니 주소가 나와버림 ㅠㅠ
밑으로 내려가 보면 어떻게 출력하는지 알 수 있을 거예요.
[기본 생성자 만들기]
생성자를 만들고 싶은 곳에 커서를 두고 누르고 ctrl + space를 눌러주세요!
후에 해당 클래스에 커서를 가져다두고 클릭 끝!
[매개변수가 있는 생성자 만들기]
생성자를 만들고 싶은 곳에 커서를 두고, <source> → <Generate Construtor using Fields> → 원하는 멤버변수를 눌러주고 <Generate>
그러면 위의 화면처럼 예쁘게 만들어진답니다! super는 나중에 설명.
<5주차 질문 중 3번> 참고
[생성자 오버로딩]
생성자 또한 메소드이기 때문에 오버로딩 가능하다.
생성자에서 this가 있으면 생성자들끼리 호출한다는 뜻,, 자기들끼리 호출하다가 오류나는 경우가 많다.
사용하는 일은 없지만 있다는 것을 알아두기!
public Friend(){
this("삼장법사" , 40);
}의 this는 밑의 public Friend를 호출하는 것. 괄호 () 안이 빈 것.
<5주차 질문 중 3번> 참고
[(전날 했던) FitnessVO을 이용해 회원가입]
raw data가 아닌 경우는 내부에서 값이 구하는 것!
raw data만 가지고 생성자 생성하기
public class FitnessService{} 클래스의 생성자 public class FitnessService(){}에 {} 안에 keyin을 넣는 이유는 생성자가 기능을 하기 때문이다. 단순하게 값만 저장할 경우에는 public class FitnessService(){}에 아무것도 없지만(왜냐하면 기능을 할 필요가 없기 때문)
[main, Service, VO]
- 메인:
자기가 했던 것을 세분화해 서비스로 나눔(그래서 메인이 작아진다는 것)
구동해주고 실제 서비스의 구현은 서비스가 한다. 메인은 트리거의 역할만!
메인은 서비스를 생성하는 일만
- 서비스: 메인이 하는 일을 세분화
- VO : 단순하게 데이터를 저장하는 것
[3교시]
<선생님꺼 과정에 따라 맞게 캡쳐한 부분, 따라해보기>
FitnessTest, FitnessVO, FitnessService의 총 3개의 파일이 있어야함
잘 작동하는지 테스트해볼 FitnessTest를 만들어 주세요.
기능을 수행할 FitnessService도 만들어주세요.
이곳의 생성자는 while을 가지고 반복하는 기능을 함?
+ 추가설명 : VO 클래스의 생성자에는 {} 비어있지만 Service 클래스는 생성자의 기능이 있기때문에 해당 기능이 안에 들어오는 것!
System.out.println();
매개변수 알아야함. 딱 가려짐 ㅠㅠ
입력값에 문자열을 넣으면 바로 오류 발생
while(ture)무한 반복을 끝내기 위해 switch 사용
FitnessTest f = new FitnessTest(); 이 호출한 메소드는 switch이다. ??
숫자가 아닌 문자를 입력한 경우 죽어버린다. Exception이라고 함.
[오후 수업]
오후수업도 오류나서 일단 선생님이 한 거 따라해보기, 순서대로임
FitnessService service = new FitnessService();에서
FitnessService service을 떼고 new FitnessService();만 사용해도 된다.
안그러면 매번 int a = service.SOMETHING; 이렇게 써야하기도 하고,, 또 이유가 있겠지
기본생성자말고 다른 매개변수가 있는 생성자 만들기
위로 올라가면 기본생성자, 매개변수가 있는 생성자 만드는 방법 있음
[Create 회원가입]
FitnessVO member;
한 사람에 대한 정보를 담을 member 변수 선언
멤버단에 올리는 것들은 우리가 공유할 것들을 올림
FitnessVO member; //외부로부터 이름, 키, 몸무게를 입력받으면 사용.
기본생성자말고 오버로딩된 생성자를 사용한다.
FitnessVO member;
다른 클래스를 저렇게 멤버변수로 만들 수 있나?
<6주차_질문 3번>
if(member != null) :널이 아닌 경우 "회원가입을 할 수 없습니다."
switch안의 create();가 호출한 것임
[Retrieve 회원조회]
가입을 해야 조회가능!
조회할 것이 없을 경우 null
여기서는 조회를 할거임!
if(member == null) 조회할 정보가 없다면
[Update 정보 수정]
- 키와 몸무게를 입력받고
- setter를 이용해 값 수정
<내가 수업시간에 했다가 오류난거>
아이디, 키 등등 키보드로 입력 받음
왜 자꾸 오류야 ㅠㅠ
오류난 이유는 내꺼의 클래스명은 FitnessVO이기때문
선언만 했을 경우 값이 (null), 그렇기에 NullPointException 오류가 난다. => 객체 생성 안했구나 생각하면 된다.
★오류처리할 때 들어가는 코드
member의 상자가 아무 값이라도 가지고 있다면?
[조회]
가입을 해야 조회가능!
조회할 것이 없을 경우 null
에러 잔치.. 다시 해보기
에러가 자꾸 뜨면 진짜 하기 시ㅣㅀ다..
FitnessVO를 Fitness member;라고 해서 오류
[업데이트(수정)]
- 키와 몸무게를 입력받고
- setter를 이용해 값 수정
에러 파티구나 ㅠㅠ
값을 수정할 때 setter를 이용해 수정
member.setWeight(weight);
이름과 아이디는 한번 가입시 변경불가하므로 포함사항이 아님.
♣복습 : 2021년 05월 01일 토요일
'개발자로 가는 길(국비지원과정) > 1. Java' 카테고리의 다른 글
[210428수] API + 주민번호 검증 프로그램 (0) | 2021.04.28 |
---|---|
[질문] 6주차 (0) | 2021.04.27 |
[210426월] 객체지향 프로그래미의 특징, public과 private, setter와 getter (0) | 2021.04.25 |
[질문] 5주차_주말 복습 (0) | 2021.04.24 |
[210423금] 객체지향, Class 클래스, 향상된 for문 (0) | 2021.04.23 |