메소드
재귀적 함수 호출
-> 자기 자신의 함수를 호출 가능(무한루프로 가능)
-> 프로그래밍할 때 많이 씀.
-> 해야할 일은 같은데 값은 다를 때 사용
-> 예) 시계
package oop0528;
public class Test01_Method {
public static void test(){ //함수정의
test(); //자신의 함수를 호출
}//test() end
public static long fact(int a){
if(a==0){
return 1;
}else{
return a*fact(a-1); //재귀함수
}
}//fact() end
public static void main(String[] args) {
long result=fact(3); //result 값이 있으므로 리턴값잇음
System.out.println(result);
}//main() end
}//class end
a=3 if(3==0)
else return 3*fact(3-1) //이 리턴은 값이 안나오므로 안됨
a=2 if(2==0)
else return 2*fact(2-1) //계속 함수를 부르고 있으므로 노놉
a=1 if(1==0)
else return 1*fact(1-1)
a=0 if(0==0) 1
a값은 계속 변화한다, 계속해서 fact 함수를 호출했으므로 남아있는 수는 3, 2, 1, 1
그러므로 출력값은 3*2*1=6
//main()함수는 사용자가 임의로 호출불가능
// -> 클래스가 실행될 때
// -> 자바 가상 머신(Java Virtual Machine)이 호출한다
함수는 호출해야지만 사용가능 !
자바 클래스(.class) 실행 순서 (컴퓨터를 킬 때)
main() 함수 호출 후 .class 실행
-----------------------------------
JVM -> javaw.exe
------------------------------------
운영체제(Operating System, OS) : Windows, Linux, MacOS -> 제일 먼저 실행됨
자바의 객체지향의 특징 - 플랫폼이 독립되어있다
cmd
cmd시작->cmd
>d:
>cd java0514
>cd workspace
>cd basicjava
>dir
>type 파일명.java ->메모장에 있는정보 다나옴
java 환경변수에 path를 걸어놓으면 언제어디서든 쓸수 있게 (javac에 path를 입력)
*선생님 카페 참조
환경변수 바꾸기
- 환경변수 설정하지 않으면 컴파일 안됨.
- 내컴퓨터->속성->고급 시스템 설정->설정변경
-> 고급-> 환경변수-> 시스템변수 ->
① JAVA_HOME 환경변수 C:\Program Files\Java\jdk1.8.0_161
② Path 편집 (삭제 절대 안됨)
-문장 맨 앞에 넣을 경우 -> %JAVA_HOME%\bin;
-마지막 문장 뒤에 넣을 경우 -> ;%JAVA_HOME%\bin
③ CLASSPATH 환경변수 (콘솔창에서 자바클래스를 직접 실행할 경우 추가)
.;%JAVA_HOME%\lib\tools.jar;
④ 자바버전확인 : 시작-> cmd -> java -version
public class MainTest {
public static void main(String[] args) {
System.out.println("main()함수에 값 전달 연습") ;
for(int idx=0; idx<args.length; idx++){
System.out.println(args[idx]) ;
}//for end
}//main() end
}//class end
main함수에 변수를 넣어준거다 . 매개변수 자료형 String
보통의 숫자처럼 보이는 핸드폰 숫자, 우편번호는 숫자가 아닌 스트링변수로 표현되어있다 신기.
메소드 오버로딩 method overloading
(자바의 객체지향에선 오버라이딩이 더 중요함 ㅋ ,)
함수명 중복정의 : 함수의 같은 이름 재사용 ! 재설정아님
변수명은 중복사용안됨, 함수는 가능 ! !
print 함수 중복사용 가능
BUT, 각 함수의 매개변수의 갯수가 다르게 줘야한다. 그럼 다르게 인식함 똑똑스
오버로딩 특징
1) 매개변수의 갯수가 달라야한다.
print(하나), print(두개)여도 위의 print 함수의 매개변수 갯수에 따라 찾아간다
2) 매개변수의 자료형이 달라야한다
위의 int값의 출력값과 같이 각 print 함수의 매개변수 갯수에 따라 알맞은 함수를 찾아 답을 출력해낸다
3) 함수의 리턴형은 오버로딩에 포함되지 않는다.
Math 클래스
abs
정렬 Sort
의미 : 특정한 키(key field)를 기준으로 순서대로 재배치하는 것
필드 = 변수 = 칼럼
ex) 쇼핑몰에서 이름순, 날짜순 이런거 / 오름차순 내림차순
정렬의 유형
- 오름차순 ascending ASC : 1->10, A->Z, a->z(알파벳은 대문자가 먼저, 아스키코드 대<소), ㄱ->ㅎ
- 내림차순 descending DESC :
정렬의 방법
- 삽입정렬(insertiont sort)
- 선택정렬(seletion sort) : 앞부터 정렬이 된다
9 7 5 3 1 -> 1 3 5 7 9
a a+1
if( > ) {tmp=a, a=b, b=tmp} swap
if( < ) {rank++ } swap
if( == ) { lotto } swap
랭크는 앞수보다 뒷수가 더 크면 밀려나지만, 정렬은 크다면 교환.
예제)
9 7 5 3 1 -> 1 3 5 7 9
step1. 첫자리 바꿔주기
7 9 5 3 1
5 9 7 3 1
3 9 7 5 1
1 9 7 5 3
step2. 두번째 자리 바꿔주기
1 9 7 5 3
1 7 9 5 3
1 5 9 7 3
1 3 9 7 5
step3. 세번째 자리 바꿔주기
1 3 9 7 5
1 3 7 9 5
1 3 5 9 7
step4. 네번째 자리 바꿔주기
1 3 5 9 7
1 3 5 7 9
문제)selection sort 알고리즘을 이용해서 오름차순으로 정렬 후 출력하시오
int[] su={9,7,5,3,1};
for(int a=0; a<su.length-1 ;a++){ //length에 -1을 해야함
for(int b=a+1; b<su.length ;b++){ //왜냐 a+1을 해준다면 length값이 5까지 가므로
//회전수가 5로 가는건 아니다, 4까지
if(su[a]>su[b]){ //앞에 수가 뒤에 수보다 크다면 실행, 앞 수(큰수)
int tmp=su[a]; //큰수를 tmp에 대입
su[a]=su[b]; //큰수를 뒤에 수에 대입
su[b]=tmp; //뒤에 수에 tmp를 대입= 뒤에수를 큰 수로 교환
}//if end
}//for end
}//for end
for(int idx=0;idx<su.length ;idx++){
System.out.print(su[idx]+" ");
}//for end
출력결과
1 3 5 7 9
- 버블정렬(bubble sort) : 뒤부터 정렬이 된다
정렬하려는 숫자가 a개라면 나오는 정렬step수는 a-1이다.
*참조 : 역삼각형만들기, 회전수 감소
예제)
9 7 5 3 1 -> 1 3 5 7 9
step1
7 9 5 3 1
7 5 9 3 1
7 5 3 9 1
7 5 3 1 9
step2
5 7 3 1 9
5 3 7 1 9
5 3 1 7 9
step3
3 5 1 7 9
3 1 5 7 9
step4
1 3 5 7 9
문제)bubble sort 알고리즘을 이용해서 내림차순으로 정렬 후 출력하시오
int[] su={9,7,5,3,1};
for(int a=3;a>=0;a--){
for(int b=0;b<=a;b++){
if(su[b]<su[b+1]){ //내림차순 뒤에가 크면 바꾸는것
int tmp=su[b+1]; //큰수를 tmp에 대입
su[b+1]=su[b];// 작은수에 큰수를 대입
su[b]=tmp; //작은값에 tmp대입
}//swap
}//for end
}//for end
for(int idx=0;idx<su.length ;idx++){
System.out.print(su[idx]+" ");
}//for end
출력결과
9 7 5 3 1
- quick sort, shell sort, ~~
클래스 팩키지 선언해서 정렬하깅
팩키지는 한번만 선언할 수 있다
사용하고자 하는 클래스의 팩키지를 선언하고 싶다면 해당 팩키지를 import해서 선언하면 된다.
클래스의 팩키지 선언할 때 * 로 표시할 경우 해당 팩키지안에 있는 모든 클래스는 사용가능하다는 뜻임
Arrays 클래스를 이용해서 정렬하기
↓주말과제↓
문제) 로또번호 1~45사이 중에서 서로 겹치지 않게 6개 발생
*참고 : 삼각형만들기 , 회전수 늘어남
등수
if(자신< ) {rank+1}
정렬 (오름차순일때)
if(자신> ) { swap }
로또번호
if(자신== ) { random() 다시 발생 }
숫자가 늘어날때마다 물어보는 횟수(회전수)가 늘어남
3 (회전수 0번)
3 5 (회전수 1번)
3 5 8 (회전수 2번)
ex)
3 5 7 5
a=0
b=0 0<0
a=1 b=0 0<1
if(lotto[1]==lotto[0])
5 == 3
a=2
b=0 0<2
if((lotto[2]==lotto[0])
7 == 3
if((lotto[2]==lotto[1])
7 == 5
a=3
b=0 0<3
if((lotto[3]==lotto[0])
5 == 3
if((lotto[3]==lotto[1])
5 == 5 -> 뒤에 들어온 lotto[3]를 바꿔줘야함
if((lotto[3]==lotto[2])
5 == 7 -> 남은 회전수가 있어 분석때는 적어줬지만 위에 걸렸기때매 break 걸어줘야함
int[] lotto=new int[6];
int size=lotto.length ;
for(int a=0;a<size;a++){
lotto[a]=(int)(Math.random()*45)+1; //math클래스를 이용 랜덤으로 숫자 출력
for(int b=0; b<a; b++){
if(lotto[a]==lotto[b]){
a--; // 같은 수가 나온다면 a를 하나 뺌
break; // 같은 수가 나온다면 우선 break를 걸어주고 다시 실행.
}//if end
}//for end
}//for end
Arrays.sort(lotto);
for(int idx=0;idx<lotto.length ;idx++){
System.out.print(lotto[idx]+" ");
}//for end
a가 0부터 5까지 움직인다.
숫자 중복이 된다는 의미는 if문이 성립된다는 것, if문이 성립이 된다면 숫자가 중복이 되므로 break를 걸고 다시
실행해줘야한다.
위의 ex)를 예시를 두었을 때 만약 a=2일때 if문이 성립된다하면 a=2는 지운다(이 뜻은 a=2를 돌렸을 시, if문이 성립안할때까지 돌린다)
a=2를 지우고 다시 첫번째 for문으로 돌아가 a=2를 실행시킨다. 그러고 if문이 성립이 안된다면 성공, a=3으로 넘어가
다음 숫자를 출력한다.
이렇게 a가 5까지 출력이 된다면 끝!
문제 7) 10진수값을 2진수값으로 변환 후 출력하시오
int binary=13; //1101
binary[0]=1 <---5를 2로 한번 나눴을 때,
binary[1]=0 <---5를 2로 두번 나눴을 때,
int num=5; //101 -나머지값 모으기 배열도 가능
int[] binary=new int[8];
int count=0;
while(true){ //무한loop로 돌리기
binary[count]=num%2;
count++; //count변수는 나누는 횟수를 말함
num=num/2; //count변수로 나눈 후 몫을 또 나눠야 하므로 몫연산자 /를 써줌
if(num==1){
binary[count]=num; //
break;
}
}//while
for(int idx=count; idx>=0; idx--){
System.out.print(binary[idx]);
}//for end
System.out.println();
출력결과
101
Integer 클래스를 활용한 수의 변환
-위의 코딩을 클래스 설정으로 가능함 ㅠ 눙물
System.out.println(Integer.toBinaryString(5)); //2진수
System.out.println(Integer.toOctalString(10)); //8진수
System.out.println(Integer.toHexString(10)); //16진수
출력결과
101
12
a
'공부 > 자바 OOP' 카테고리의 다른 글
5월30일 - this() / static / final (0) | 2019.05.30 |
---|---|
5월29일 - Class (0) | 2019.05.29 |
5월23일 - Method 메소드 ★매우 중요★ (0) | 2019.05.23 |
5월 22일 - 배열 2+연습문제 (0) | 2019.05.22 |
5월 21일 - 배열 1 (0) | 2019.05.21 |