카멜, 파스칼, 스네이크 표기법
- 카멜 표기법 - 각 단어들의 첫글자만 대문자로 표기하고 나머지는 소문자로 표기하되 첫단어의 경우 모두 소문자처리하는 형태의 표기법이다.
- 카멜표기법의 경우 Java 에서는 일반적으로 변수명과 메소드명을 지정할 때 사용할 것을 권장
ex) save + button -> saveButton
- 파스칼 - 단어들의 첫글자는 대문자로 표기하며, 첫글자를 제외한 나머지 문자들을 소문자로 표현하는 형태
- Java 에서 클래스명을 사용할 때 첫글자는 대문자로 시작하는 것을 권장하기 때문에 일반적으로 클래스명을 지정할 경우 파스칼 표기법을 활용
ex) save + button -> SaveButton
- 스네이크 표기법 - 모든 단어들을 소문자 또는 대문자로 표기하며, 각 단어들 간의 구분을 _(언더바)를 통하여 구분하는 방법
- 스네이크 표기법은 상수를 표현하거나 데이터베이스, 디자인 영역에서 주로 사용되는 방법이었으나 현재는 잘 사용하지 않는 표기법
ex) save + button -> save_button
Math 클래스
- Math 에서는 올림, 버림, 반올림 등 각종 수와 관련된 기능들을 제공(숫자와 관련된 처리를 하기 위한 클래스)
올림 | Math.ceil(값) |
버림 | Math.floor(값) |
반올림 | Math.round(값) |
+) math는 기본클래스여서 Scanner을 사용할 때 처럼 import구문이 필요하지 않다.
- 예제
double a = 3.1415;
System.out.println(Math.ceil(a));
System.out.println(Math.floor(a));
System.out.println(Math.round(a));
결과값은 차례대로 4.0 ,3.0, 3이 출력되고 만약 올림과 내림에 자릿수를 더 표현하고싶다면 (a*100)/100형태로 자릿수를 늘리면 된다. 반올림은 (a*100)/100f 형태와 같이 실수로 변환을 하면 자릿수를 더 표현할 수있다.
- 절대값
- 절대값은 Math.abs(값)으로 처리할 수 있다.
int b = -7;
System.out.println(Math.abs(b));
결과값으로 -7의 절대값인 7이 출력된다
- 난수생성
- Math.random()을 통하여 난수를 생성
- 특정 범위의 난수생성
- Math.floor(Math.random() * 범위숫자 개수) + 시작값
// Math.random()을 floor로 감싸는 이유는 ceil과 round는 값을 균등하게 가져가지 않기때문이다.
↓아래그림참조↓
예제) 특정 범위의 난수생성을 사용하여 로또번호 생성하기
package Day1202;
import java.util.Arrays;
public class Lotto {
public static void main(String[] args) {
int[] lotto=new int [6]; //로또 번호 담은 배열변수
for(int times= 0; times<lotto.length-1; times++) {
lotto[0]=(int) Math.floor(Math.random()*45)+1; // 1번 째 번호
for(int i =1; i<lotto.length; i++) { //2 ~ 6까지 번호 뽑는 횟수
lotto[i]=(int) Math.floor(Math.random()*45)+1; // 2 ~ 6 숫자 뽑기
for(int j=0; j<i; j++) {
if(lotto[i]==lotto[j]) {
//비교하다 해당차례에서 중복 수가 나오면
//그 차례를 다시 뽑으면 되기 때문에 i--해주면 해결된다.
i--;
}
}
}
System.out.println(Arrays.toString(lotto)); // 배열을 문자열로 출력해준다.
}
}
}
상속 - 소지한 내용들을 물려받는 것. 클래스간의 관계이며 1 : 1로만 사용한다.
( 공통기능을 제공할때나 개선사항이 필요할 때 사용한다. )
형태는 접근권한 class 클래스명 extends 부모클래스명{ }
상속은 1:1 매치만 가능하기때문에 C 클래스가 A클래스와 B클래스 모두 상속받는 것은 불가능.
클래스를 세개 생성한 후 상속에 관한 예제를 살펴보겠다.
main함수가 있는 Test13, 부모변수가 있는 Test13P, 자식변수가 있는 Test13C
자식변수는 부모변수클래스를 참조함으로 public class Test13C extends Test13P 와 같이 클래스 선언을 한다.
//메인클래스
package Day1202;
public class Test13 {
public static void main(String[] args) {
Test13C tc = new Test13C();
System.out.println(tc.s);
System.out.println(tc.getPs());
}
}
main에서 Test13C에 있는 s를 호출하였을 때 출력되는 결과는 "자식변수" 이다. 부모클래스 자식클래스 둘 다 s가 존재하지만 main에서는 더 가까운 곳에 있는 변수를 출력하기 때문에 자식변수가 출력된다.
이러한 것때문에 따로 부모변수를 출력할 수 있는 방법도 있다. super.s 와 같이 변수 앞에 super.변수명 을 선언한다면 부모클래스를 호출한다.
//자식변수클래스
package Day1202;
public class Test13C extends Test13P {
String s = "자식변수";
public String getPs() {
return super.s;
}
public void test() //1번
{
System.out.println("테스트 : 자식 ");
}
public void test(String str) //2번
{
System.out.println("테스트 : " + str);
}
}
코드 1번, 2번과 같이 메소드명은 같아도 반환타입이 다르다면 선언이 가능하다.
//부모변수클래스
package Day1202;
public class Test13P {
String s = "부모변수";
public void test() {
System.out.println("테스트 : 부모");
}
}
오버라이딩과 오버로딩
위치 | 역할 | 조건 | |
오버라이딩 | 상속관계 | ( 갱신 ) update | - 반환타입, 메소드명, 인자타입, 인자개수가 동일 - 접근권한 범위가 넓어질 수 있음 - 예외처리 범위가 좁아질 수 있음 |
오버로딩 | 한 클래스 내부 | ( 신규 ) new | - 반환타입, 메소드명만 동일 |
객체생성
A가 부모 클래스, B가 자식 클래스
B클래스가 A클래스를 담을 그릇이 되니 당연히 B클래스의 크기가 더 크다.
객체생성에서 항상 내용물은 형태의 이상으로 있어야한다. 내용물이 형태를 초과하는 것은 상관이 없지만, 내용물이 형태보다 적게 있어서는 안된다.
첫번째 경우와 두번째 경우는 문제 없이 객체생성가능.
세번째 경우는 내용물이 더 많지만 문제가 될 것은 없음.
↳ 추후에 배울 클래스형변환이 가능하기때문이다
네번째 경우는 문제가 되는데 아래의 예시로 이해해보자
내용물 > 형태 → ex) 아이폰 13프로를 샀는데 충전기를 두개나 더 줬다 ! = 문제될 것 없음 !
내용물 < 형태 → ex) 아이폰 13프로를 샀는데 껍데기만 오고 메인보드가 없이왔다 = 매우 문제
항상 형태를 통해 기능을 호출하기때문에 형태를 통해 어떠한 메소드를 실행해달라 명령했지만 어 ? 나 그거 실행 못해 ! 기능없어 ! 하면 문제가 되는 것
'Java 시작' 카테고리의 다른 글
(2021-12-03) [ 참조, 추상화, 패키지, List ] (0) | 2021.12.04 |
---|---|
(21-11-29) [다차원배열 / 클래스 / 메소드 / 생성자 / 스캐너] (0) | 2021.11.29 |
(21-11-25) [기본 자료형의 형변환 / 문자열과 관련된 명령어 / 배열] (0) | 2021.11.26 |
자바기초 (0) | 2021.11.24 |
자바 2일차 임시 (0) | 2021.11.23 |