본문 바로가기

Java 시작

(21-12-02) [ 카멜, 파스칼, 스네이크 표기법 / Math 클래스 / 상속 / 오버라이딩과 오버로딩 / 객체생성 ]

카멜, 파스칼, 스네이크 표기법

  • 카멜 표기법  -  각 단어들의 첫글자만 대문자로 표기하고 나머지는 소문자로 표기하되 첫단어의 경우 모두 소문자처리하는 형태의 표기법이다.
  • 카멜표기법의 경우 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프로를 샀는데 껍데기만 오고 메인보드가 없이왔다 = 매우 문제

 

항상 형태를 통해 기능을 호출하기때문에 형태를 통해 어떠한 메소드를 실행해달라 명령했지만 어 ? 나 그거 실행 못해 ! 기능없어 ! 하면 문제가 되는 것