JAVA 9일차(221103)

점햠미·2022년 11월 3일
0

JATBAP'S JAVA

목록 보기
9/22
post-thumbnail

1.아래를 프로그래밍 하시오.

다음 멤버를 가지고 직사각형을 표현하는 Rectangle 클래스를 작성하라.

int 타입의 x, y, width, height 필드: 사각형을 구성하는 점과 크기 정보
x, y, width, height 값을 매개변수로 받아 필드를 초기화하는 생성자
int square() : 사각형 넓이 리턴
void show() : 사각형의 좌표와 넓이를 화면에 출력
boolean contatins(Rectangle r) : 
매개변수로 받은 r이 현 사각형 안에 있으면 true 리턴
main() 메소드의 코드와 실행 결과는 다음과 같다

public static void main(String[] args) {
Rectangle r = new Rectangle(2, 2, 8, 7);
Rectangle s = new Rectangle(5, 5, 6, 6);
Rectangle t = new Rectangle(1, 1, 10, 10);

r.show();
System.out.println("s의 면적은 "+s.square());
if(t.contains(r)) System.out.println("t는 r을 포함합니다.");
if(t.contains(s)) System.out.println("t는 s를 포함합니다.");
}

출력
========================
(2,2)에서 크기가 8x7인 사각형
s의 면적은 36
t는 r을 포함합니다.
public class Rectangle {
	private int x, y, width, height;
	private int x2, y2;

	public Rectangle(int x, int y, int width, int height) {
		this.x = x;
		this.y = y;
		this.width = width;
		this.height = height;
	}
	
	+getter, stetter추가할것

	public int square(){
		return width * height;
	}
	
	public void show() {
		System.out.println("("+x + ","+y+")에서 크기가
        "+width+"x"+height+"인 사각형");
	}
	
	public boolean contains(Rectangle compare) {
		this.x2 = x + width;
		this.y2 = y + height;
		
		if((this.x < compare.x) && 
        (this.y2 > compare.y2) && 
        (this.x2 > compare.x2) ){  //x=y 값이 같아서 시작값은 x만 비교함
			return true;
		}else
			return false;	
	}
}

저에게 너무 심화과정을 바라시는 것 같습니다...나는야泥棒

2.스트링 객체를 생성하는 2가지 방법은?

this. :키워드 this를 이용한 인스턴스 변수의 
접근 객체 생성 했을 때의 자기 자신을 나타냄.

인스턴스 변수 자기자신과 매개변수(파라미터)로 들어오는 변수의
이름이 동일할 경우 구분을 위해서 사용 (이 용도 이상으로는 쓰이지 않는다.)

3.String 객체가 immutable 인 이유는?

String은 어떤 프로그래밍 언어라도 String 타입은 매우 빈번하게 사용된다. 
그래서 Java에서는 String Pool이라는 공간에 String을 포함시켜서, 
매번 String 객체를 새로 생성하기보다는 값이 같은 String이라면 
String Pool에 있는 객체를 재사용할 수 있도록 구현했다.
즉 값이 같은 String은 String Pool 내에서 String 객체를 공유하도록 한 것이다. 
그런데 공유를 하려면 String은 반드시 immutable, 즉 불변이어야 한다.

String s1 = "Java"; 
String s2 = "Java"; 

만약 String이 mutable하다면 
s1의 값만 "C++"로 바꿀 수 있고 s2는 그대로 "Java"로 남아있게 되는 셈인데, 
값이 다른데 같은 참조를 가진다는 것은 말이 안된다. 
즉 String 타입이 mutable하다면, String 객체끼리의 공유는 불가능하게 된다.
(실제로는 s1을 "C++"로 바꾸면, String Pool에 
이미 "C++" 값을 가진 객체가 있으면 그 객체를 참조하고, 
없다면 String Pool에 새로운 객체를 생성한다.)

결국 Java에서는 String pool을 구현하기 위해 
String을 immutable한 객체로 만들어야 했던 것이다.

2. 보안
Java에서 메서드의 파라미터로 String을 받는 경우는 매우 흔하다.
예를 들어 사용자의 이름이나 패스워드, 
혹은 네트워크 연결을 위한 포트 번호나 connection URL, 
파일 이름 등 중요한 정보를 String으로 받을 때가 많다. 
그런데 String이 mutable하다면, 메서드의 인자로 받은 값은 
메서드의 caller(호출자)에 의해 언제든지 바뀔 수 있게 된다. 
이는 보안상 엄청난 취약점을 발생시킨다.

3. 동기화 (Synchronization)
객체가 불변이면 멀티 스레드 환경에서도 값이 바뀔 위험이 없기 때문에, 
자연스럽게 thread-safe한 특성을 갖게 되고, 
동기화와 관련된 위험 요소에서 벗어날 수 있다. 
여러 스레드에서 동시에 접근해도 별다른 문제가 없다.
또한 String의 경우 한 스레드에서 값을 바꾸면, 
해당 객체의 값을 수정하는 것이 아니라 새로운 객체를 String Pool에 생성한다. 
따라서 thread-safe하다고 볼 수 있다.

4. Hashcode Caching
String의 hashCode() 메서드 구현을 보면, 
아직 hash 값을 계산한 적이 없을 때 최초 1번만 실제 계산 로직을 수행한다. 
이후부터는 이전에 계산했던 값을 그냥 리턴만 하도록 되어 있다. 
즉 hashCode 값을 캐싱(caching)하고 있다.

String.hashCode()

이렇게 caching이 가능한 것도 결국 String이 불변이기 때문에 
얻을 수 있는 이점이다.

hashCode() 메서드는 Hash 자료구조의 구현체, 
예를 들면 HashMap, HashTable, HashSet와 같은 클래스에서 꽤 자주 호출된다. 
String 객체와 함께 Hash 구현체를 사용하는 경우라면 
이러한 caching 덕분에 성능상 큰 이점을 볼 수 있을 것이다.

출처 : https://starkying.tistory.com/entry/why-java-string-is-immutable

4.사용자로부터 받은 문자열(영문으로)에서 자음과 모음 개수를 계산하는 프로그램을 작성하라.

힌트:String 객체의 charAt 함수를 활용
===
입력:abcd

출력:
총글자수는 4개
자음:3 개
모음:1 개
===============
import java.util.*;

public class textTest {

   public static void main(String[] args) {
      int j = 0;
      int m = 0;
      String str;
      
      System.out.print("입력: ");
      Scanner sc = new Scanner(System.in);
      str = sc.next();
      
      for(int i =0; i < str.length(); i++) { //index 0번부터 시작
         switch(str.charAt(i)) {             
         //문자열을 캐릭터로 바꾼 뒤 비교 
         case 'a' :
         case 'e':
         case 'i':      
         case 'o':         
         case 'u':
            m++;
            break;
         default:
            j++;
         }
      }
      System.out.println("총 글자 수: "+ str.length()+"개");
      System.out.println("모음 : " + m + "개");
      System.out.println("자음 : " + j + "개");
   }
}

갑자기 너무 심화과정이라서 당황스럽네요......................
너무 당황스러운 나머지 강사님껄 쓰윽했습니다.

5.사용자에게 받은 문자열을 역순으로 화면에 출력하는 프로그램을 작성하시오.

힌트:String 객체의 charAt 함수를 활용
입력:abcde
출력:edcba
public class Reverse {
	public static void main(String[] args) {
		String word;
		
		Scanner scanner = new Scanner(System.in);
		System.out.println("영어 단어를 입력하세요.");
		word = scanner.next();
		
		for (int i = word.length()-1; i>=0;i--){
			System.out.print(word.charAt(i));
		}
	}
}

6.String 클래스에서 concat 메서드를 설명하시오.

concat은 String끼리 붙일 때 사용할 수 있다.

"문자열1" + "문자열2" 연결의 경우, 
"문자열1".concat("문자열2")와 같은 방법으로 연결

String으로 생성되는 객체는 immutable이기 때문에 
리터럴이 바뀌지 않는다. 덧붙이거나 뗄 수 없다. 
그래서 concat() 메소드를 사용해 Stirng 클래스를 붙이면 그때마다 계속 
새로운 객체를 생성한다. (그림 참고)

concat() 메소드는 계속 이어서 호출 가능 

7.str.substring(2, 4); substring 사용법에 대하여 설명하시오.

문자열 일부를 출력하는 것.
String str = "abcdefg";

str.substring(2);        //인덱스 2 부터 끝까지. 문자열 "cdefg" 반환
str.substring(2, 4);     //인덱스 2 ~ 3에 위치한 내용의 문자열 "cd" 반환

//함수 오버로딩 적용됨
//index는 0부터 셈

8.String.valueOf 에 대하여 설명하시오.

기본 자료형(모든 타입을)의 값을 문자열로 바꿀 때 사용하는 valueOf() 메소드
함수 오버로딩이 적용되어 있어 기본 자료형 8개의 타입의 값을 
모두 String 타입으로 바꿔줄 수 있다.
double e = 2.718281;

String se = String.valueOf(e);  
//valueOf();는 함수이고, .으로 접근하는 static임
//se에는 "2.718281"

static String valueOf(boolean b) 
static String valueOf(char c)
static String valueOf(double d)
static String valueOf(float f)
static String valueOf(int i)
static String valueOf(long l)
// 함수 오버로딩이 적용되어있다.

9.st1.compareTo(st2);compareTo 사용법에 대하여 설명하시오.

compareTo() 메소드 와 compareToIgnoreCase() 메소드 
(IgnoreCase → 대소문자 구분안함)
문자열의 내용을 비교해서 사전 상에서 앞에 있는지 뒤에 있는지 알려 줌
java
int cmp;       //리턴값은 정수 int
cmp = st1.compareTo(st2);**

cmp == 0 → 같은 문자열이다.
cmp < 0 → st1이 앞에 나온다.
cmp > 0 → st1이 뒤에 나온다.

10. 아래의 연산과정에서 호출되는 함수(원리)를 써서 표현해 보세요.

String str = "age: " + 17;
	String str = "age: " + 17;
		// X String str = "age: ".concat(17);
		// O str = "age: ".concat(String.valueOf(17));
		System.out.println(str);

11.StringBuilder 와 String 의 차이는?

String은 immutable(불변함) 이고 → 값 변화 못시킴
StringBuilder와 StringBuffer는 mutable(변함) 이다. → 값 변화 시킴

String은 immutable이기 때문에 예를 들어 + ( concat() ) 를 하게되면 
기존의 메모리를 두고 계속 새로운 객체를 생성한다.

만일 for문으로 concat()을 계속 사용하게 로직을 사용 하면
StringBuilder나 StringBuffer에 비해 시간도 오래 걸리고, 
메모리공간도 많이 사용하게 되는 단점이 있다. 
(It costs a lot! 비용이 든다. _비용보다 시간이 더)

반면에 StringBilder 와 StirngBuffer는 mutable이라서 
최초 한번만 객체를 생성하고 거기에 + ( append() )를 할 경우
같은 주소(가리키고 있는)의 메모리 공간 안에서 
객체 크기를 증가 시키며 두 문자열을 더해준다. ([최적화])

StringBuilder, StringBuffer 메소드 예시 (string에도 있는 메소드이다.)
profile
인생 망함 개조빱임

0개의 댓글