본문 바로가기

공부/자바 OOP

5월28일 - 메소드 + 정렬

메소드

 

재귀적 함수 호출 

-> 자기 자신의 함수를 호출 가능(무한루프로 가능)

-> 프로그래밍할 때 많이 씀.

-> 해야할 일은 같은데 값은 다를 때 사용

-> 예) 시계 

 

{}가 아닌 ; 로 한다면 클래스

 

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)이 호출한다

 

자바 가상머신 (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) 매개변수의 갯수가 달라야한다.

 

출력값 ; 3 2 4

print(하나), print(두개)여도 위의 print 함수의 매개변수 갯수에 따라 찾아간다

 

2) 매개변수의 자료형이 달라야한다

 

자료형이 달라야함 

 

출력값 ; 5.6 7.2 8.3

 

위의 int값의 출력값과 같이 각 print 함수의 매개변수 갯수에 따라 알맞은 함수를 찾아 답을 출력해낸다

 

3) 함수의 리턴형은 오버로딩에 포함되지 않는다.

 

에러뜸 !!!!!

Math 클래스

abs

 

출력값 ; 3 5 1.2 4.6

 

정렬 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 클래스를 이용해서 정렬하기

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