프로그래밍공부노트

Day 10 - JAVA (완전수 구하기, 친화수 구하기, && , String) 본문

JAVA

Day 10 - JAVA (완전수 구하기, 친화수 구하기, && , String)

SANGJIN-YU 2021. 2. 23. 23:42
반응형

21. for문 ing............

 1) 진약수의 합과 범위에서의 갯수

    - 진약수란 0과 자기자신을 제외하고 0으로 나누어 떨어지는 수

 2) 완전수 1번을 jar로 packaging하여 사용

    - 어떠한 숫자 A의 진약수 합이 A가 되는 수

      ex) 6의 약수는 1,2,3이다. 각 요소를 더하면 1 + 2 + 3 = 6

    - 라이브러리를 사용하여 정수를 입력받고 입력받은 점수를 범위의 끝으로 지정한다

      2부터 입력받은 정수까지 완전수를 출력해주세요.

 

import com.edu.util.num.ProperDivisor;

public class Numbers_Perfect {
	
	
	ProperDivisor pd = new ProperDivisor();
	
	//완전수는 진약수의 합이 자기자신
	//i 의 진약수의 합이 i 이면 i는 완전수
	public void perfectNum(int range) {
	
		for (int i = 1; i < range; i++) {
			int sum = pd.yaksuSumCal(i); //약수의 합을 구하는 메소드를 활용, 반환값을 sum에 담음
			if (i == sum) { // 'i의 약수의 합인 sum이 i와 같다면'의 조건
				System.out.printf("%d은 완전수입니다.\n",i);
			}
		}
	}
}
import com.edu.util.input.ScanInputInteger; // 직접 만든 API를 EXPORT후 다시 IMPORT하여 사용
											// 입력기능 Scanner
import com.edu.util.num.ProperDivisor;

public class Numbers_Main {

	public static void main(String[] args) {
		
		int m = ScanInputInteger.integerValueIn(); // 입력받은 값을 m에 저장
        
        		Numbers_Perfect np = new Numbers_Perfect();
		np.perfectNum(m); // m의 값까지의 범위에서 완전수를 구함 

500을 입력하고 범위에 있는 완전수를 출력


 3) 친화수 1)번을 jar로 packaging해서 사용

    - A라는 숫자의 진약수의 합이 B이고

    - B의 진약수의 합이 A라면

    - A와 B는 친화수라고 한다.   (220 284)

 

 배운대로 만든 조금 오래걸리는 방법

import com.edu.util.num.ProperDivisor;

public class Numbers_Friedly {

	//친화수 찾기
	//a의 진약수의 합이 b
	//b의 진약수의 합이 a
	//a와 b 는 친화수라고 말함
	ProperDivisor pd =  new ProperDivisor();
	
		public void friendly(int range) {
		for (int i = 2; i < range; i++) { // 입력받은 값을 범위 지정, 0과1은 진약수가 없어서 2부터
			for (int j = 2; j < range; j++) {
            	// j의 약수의 합이 i이고 i의 약수의 합이 j면서 i와j가 같지 않고 i가 j보다 작은 조건
				if(i == pd.yaksuSumCal(j) && j == pd.yaksuSumCal(i) && i !=j && i<j ) {
					System.out.printf("%d 와 %d는 친화수입니다.",i,j);
				}
			}
	}
}

500까지의 친화수를 출력

import com.edu.util.num.ProperDivisor; // 진약수 구하는 내가만든 라이브러리를 사용

public class Numbers_Friedly {

	//친화수 찾기
	//a의 진약수의 합이 b
	//b의 진약수의 합이 a
	//a와 b 는 친화수라고 말함
	ProperDivisor pd =  new ProperDivisor();
	
	public void friendly_New(int range) {
		
	for (int i = 2; i < range; i++) { //for문을 돌리면서스택이 쌓이는 것을 줄이기 위해서 i를 분리하여
                                      //변수에 담아 사용
		int tmp = i; //220
		int a = pd.yaksuSumCal(tmp); //228 // tmp가 1씩 증가하면 진약수의 합을 a에 담는다
		int b = pd.yaksuSumCal(a); // 220 // 진약수 a의 합을 b에 담는다
		
		if (tmp != a  && tmp < a && tmp == b) { 
			System.out.printf("%d와%d는 친화수입니다,\n",tmp,a);
		}
	}
}
}
import com.edu.util.input.ScanInputInteger;
import com.edu.util.num.ProperDivisor;

public class Numbers_Main {

	public static void main(String[] args) {
		
		int m = ScanInputInteger.integerValueIn();
//		System.out.println(m);
		
//		Numbers_Perfect np = new Numbers_Perfect();
//		np.perfectNum(m);

		Numbers_Friedly nf = new Numbers_Friedly();
		nf.friendly_New(m);

	}
}

2000을 입력받아 친화수를 구함

 

 ShortCircuit

package com.min.edu;

public class ShortCircuit {
public void test() {
		
		boolean isc1 = false;
		boolean isc2 = true;
		
		System.out.println(isTrue() & isFalse()); // false
        	// &은 앞에 확인하고 뒤도 무조건 확인
		System.out.println((isc1 = isFalse()) && (isc2 = isTrue()));
        	// &&은 앞에가 false이면 뒤에 확인하지 않고 바로 false
			// 값을 담고 결과값을 나타내야하면 & 해야함

	}
	
	public boolean isTrue() {
		System.out.println("난 true");
		return true;
	}
	
	public boolean isFalse() {
		System.out.println("난 false다");
		return false;
	}
}

 


  23. String 특징 - 아래 두가지 특징을 모두 가질 수 있다...

 참조타입

 1) 주소(heap)

 2) hashcode

 3) null 초기값

 4) 주소를 전달(pass by reference)

 5) mutable

 

기본타입

 1) 

 2) stack

 3) 리터럴

 4) 값 복사(pass by value)

 5) immutable


 - String

 1) instance화 (new)를 하지 않아도 객체가 된다.

    Scanner scan = new Scanner();

    String str1 = "행복";

    String str2 = new String("행복");

    str1과 str2는 다른영역에 만들어짐

 2) 참조타입이지만 기본타입처럼 사용한다.

    즉, 주소와 고유값을 가지고 있지만 값을 전달하는 것처럼 사용한다.

 3) immutable하여 주소를 통해서 변경이 불가능함, 만약 값이 다르면 새로운 객체를 만들어 낸다.

 4) String객체는 Object에 의해서 고유한 hashcode 값을 가진다.

 5) 객체가 생성이 되면 heap영역 중에서 String만 들어가는 String Pool 영역에 생성이 된다

     new로 생성된 객체는 다르다

 6) String에서의 연산 + Concatenation이 발생한다 : 타입과 + 문자열이 만나면 문자열로 변경이 된다

 7) 문자열인 String은 문자형인 char의 조합이다. 즉 문자열을 쪼개면 문자형(char)으로 구분할 수 있다.

     반대로 문자형(char)의 배열은 문자열로 조합시킬 수 있다.


 1) String의 객체 생성과 사용 

New 사용하지 않고 객체를 생성 New 사용하여 객체를 생성
String str1 = "JAVA";
 - "JAVA"는 String Pool 영역에 생성이 된다.
 - ref/hashcode 부여된다. java.lang.Object에 의해서 새로운 hashcode가 부여된다.
 - 같은 "JAVA"를 사용하는 객체는 같은 String Pool의 값을 사용한다.
   ex) String str3 = "JAVA"
String str2 = new String("JAVA");
 - String Pool이 아닌 heap영역에 만들어진다.
 - new에 의해서 새로운 ref/hashcode를 부여받고 사용되는 "JAVA"에 의해서 생성된 hashcode는 새로 재정의 된다.

package com.min.edu;

public class StringMain {

	public static void main(String[] args) {

		//그림 1 확인 
		//생성되는 String의 객체를 확인해보자
		String str1 = "JAVA"; // String Pool에 생성되는 객체 r01/h0A(h01)
		String str2 = "JAVA";// String Pool에 생성되는 객체 r01/h0A(h01)
		
		//1) String의 객체는 같은 값이라면 같은 객체를 사용한다.
		System.out.println(str1 == str2); // == 참조타입에서 주소를 비교 true

		
		//2) 만약 str3가 String Pool에 있는 것이라면 str1 혹은 str2와 ==비교했을 때 true
		// "JAVA" => String pool
		//"JA" + "VA" => concanteation 결과 heap객체에 만들어지는 것인지 아니면 StringPool에 있는 것을 사용하는지
		String str3 = "JA" + "VA"; // + 컨켄트네이션 문자열로 그대로
		
		
		System.out.println("Concatenation은 힙에 만들어 질까요? 아닐까요?");
		System.out.println((str1== str3)?"String pool에 만들어짐 ":"heap에 만들어짐");
		 								// 객체명에 묶여있지 않아서 string pool에 만들어짐
		
		//문자열이 String 타입에 선언되어 있다면
		//Concatenation은 heap영역에 만들어 진다.
		String ja = "JA";
		String va = "VA";
		String java = ja+va; //heap 영역에 생성
		
		System.out.println("객체명에 묶여있는 Concatenation은 힙에 만들어 질까요? 아닐까요?");
		System.out.println((str1 ==java)?"Stringpool에 만들어짐 ":" heap에 만들어짐");
        // new처럼 힙에 만들어짐
		
		//new로 생성된 객체는 heap에 있고
		//문자열은 String pool에 있음
		String str4 = new String("JAVA");
		System.out.println("new로 생성한 객체와의 비교");
		System.out.println((str1 != str4)?"값은 같지만 다름":"값도 같고 주소도 같음");
		
		
		
	}

}

 

그림1

String ja = "JA";와 String va = "VA";는 String pool 영역에 생성

하지만 객체명에 묶여있는 ja와 va를 Concatenation하여 만든 String java = ja + va; 는 heap영역에 생성

 

String str1 = "JAVA";는 String pool에 생성되고 R01이라는 ref와 HO1이라는 hash를 갖지만 가지고 있는 값에 의하여 새로운 hash로 재정의(H01 -> H0A)

 

String java = ja + va;는 문자열을 직접 Concatenation한 것이 아니라 String 타입의 객체명에 묶여 있기 때문에 heap영역에 생성되며 String str1과는 다른 객체이기 때문에 R02라는 ref와 H02라는 hash를 갖는다. 하지만  "JAVA"라는 값을 갖고 있기 때문에 hash는 str1과 같이 재정의(H02 -> H0A)

반응형