JAVA-08

JAVA08

메소드 풀이 비교

소문자인 문자열 대문자로 모두 바꾸기

나의 풀이

String makeUpper2(String str) {
		String result = "";
//		받은 문자열 길이만큼 배열을 돌면서 새로운 변수에 값을 넣어 대문자를 완성한다.
		for (int i = 0; i < str.length(); i++) {
//			만약 해당 문자가 아스키 코드의 값보다 크다는 것은 소문자라는 것임.
			if(str.charAt(i) >= 97) {
//				해당 소문자를 대문자 코드 10진수까지 감소시켜서 문자열로 형변환해서 값에다가 담는다.
				result += (char)(str.charAt(i) - 32);
			}else {
//				그 외는 원래 대문자라서 그냥 담는다.
				result += str.charAt(i);				
			}
		}
		return result;
	}

강사 풀이

String makeUpper2(String str) {
//		len이라는 변수에 문자열의 길이를 넣어 재사용성을 강조함.
		int len = str.length();
		String result = "";
		for (int i = 0; i < len; i++) {
//			코드의 가독성을 위해 길게 작성되고 반복되는 코드는 변수로 할당함.
			char ch = str.charAt(i);
//			나의 풀이랑 다른 점은  아스키코드 10진수를 안쓰고 아래처럼 바로 문자도 숫자처럼 사용이 가능.
			if(ch >= 'a' && ch <= 'z') {
//				본인과 같음
				result += (char)(ch-32);
			}
			else {
//				변수만 다름
				result += ch;
			}
		}
		return result;
	}

문자열 거꾸로 출력하기

나의 풀이

String makeReserve2(String str) {
//		결과를 담을 변수를 만든다.
		String result = "";
//		문자열의 길이만큼 반복을 시킨다.
		for (int i = 0; i < str.length(); i++) {
//			결과는 해당 문자열의 자리를 아래와 같이 길이의-1-i를 하면 거꾸로 담긴다. 
			result+= str.charAt(str.length()-1-i);
		}
		return result;
	}

강사 풀이

String reverse(String str) {
//		위 문제와 동일하게 len이라는 변수를 만들었다.
		int len = str.length();
		String result = "";
//		첫번째 방법
		for (int i = 0; i < len; i++) {
//		문자를 담는 변수를 만들고 문자열들을 할당한다.
			char ch = str.charAt(i);
//		문자를 그래도  result를 후위에 붙이면 거꾸로 만들어진다!
			result = ch + result;
		}
//		두번째 방법
//		배열 자체를 거꾸로 돌린다.
		for (int i = str.length()-1; i >= 0; i--) {
//			문자를 ch변수에 뽑아내서
			char ch = str.charAt(i);
//			result에 붙인다.
			result += ch;
		}
		return result;
	}

문자열 검사하기

나의 풀이

boolean checkStr2 (String str) {
//		매개변수와 받은 문자열과 비교할 문자열 변수를 만든다.
		String dumiNum = "";
//		매개변수의 문자열만큼 반복을 시킨다.
		for (int i = 0; i < str.length(); i++) {
//			이 문자열이 숫자로 이루어진 부분만 추출하여 비교할 문자열에 넣는다.
			if(str.charAt(i) >= 48 && str.charAt(i) <= 57) {
				dumiNum += str.charAt(i);
			}
		}
//		추출한 문자열과 매개변수의 문자열을 비교한다., 참이면 true를 거짓이면 false를 리턴한다.
		return dumiNum.equals(str) ? true : false;
	}
	

강사 풀이

boolean isdigit(String str) {
//		len을 만들어 재사용성을 높인다
		int len = str.length();
		for (int i = 0; i < len; i++) {
//			ch로 문자를 하나씩 뽑아서
			char ch = str.charAt(i);
//			숫자가 아닌게 하나라도 있다면 아래로 들어가 false로 return한다.
			if(ch<'0' || ch>'9') {
				return false;
			}
		}
//		위 조건식에 들어가지 않았다면 true를 return 하면 된다.
		return true;
	}

정수를 한글로 바꾸기

나의 풀이

String makeHangle2(int num) {
		String [] hangle = {"공","일","이","삼","사","오","육","칠","팔","구"};
		String numToStr = num + "";
		String result = "";
		for (int i = 0; i < numToStr.length(); i++) {
//			charAt은 char 타입임으로 문자열로 바꿔주기 위해서 ""을 더한다.(자동형변환);
			result += hangle[Integer.parseInt(numToStr.charAt(i)+"")];
		}
		return result;
	}

강사 풀이

String changeToHangle(int num) {
//		문자열로 만들었다. 문자열도 하나씩 뽑아서 사용이 가능하기 때문
		String hangle = "공일이삼사오육칠팔구";
//		받은 숫자를 문자열로 바꾸어 하나씩 뽑아 사용할 수 있게 하였다.
		String data = num + "";
//		len
		int len = data.length();
//		결과를 담을 변수
		String result = "";
		for (int i = 0; i < len; i++) {
//			ch라는 변수로 문자를 하나씩 뽑는다.
			char ch = data.charAt(i);
//			ch라는 변수에 들어있는 0부터 시작하는 숫자는 아스키 코드의 숫자인 48부터 들어있다.
//			idx를 만들어 48을 빼주면 0~9까지 만들어진다. 이를 곧바로 인덱스로 활용한다.
			int idx = ch-48;
			result += hangle.charAt(idx);
		}
		return result;	
	}
	

Storage Class

  • 지역 변수
    • 메소드 내부에 선언된 변수
  • 전역 변수
    • 메소드 외부, 클래스 내부에 선언된 변수
  • 정적 변수
    • static이 붙은 변수
             지역 변수 전역 변수 정적 변수
초기화 직접 자동 자동
생명주기 {   } 프로그램 종료전 프로그램 종료전
접근성
package day08;

public class StorageTest {
//	전역변수는 다른 곳에서 사용할 수 있다. 그러나 메인 메소드에서 사용 불가하다.
	int data2 = 20;
//	정적 변수는 전역변수 선언 공간에서 선언하기만 하면 아래처럼 메인 메소드에서 사용 가능하다.
	static int data3 = 30;
	public static void main(String[] args) {
//		정적변수는 메인메소드에서 사용가능하다.
		System.out.println(data3);
		//static 메소드 내부에서는 일반 전역변수를 사용할 수 없다.
		//System.out.println(data2);
	}
	void f1() {
//		여기 선언된 변수는 지역 변수이다. 지역 변수는 여기 외에서 사용 할 수 없다.
		int data1 = 10;
		System.out.println(data2);
	}
	void f2() {
//		data1은 사용할 수 없다.
		//System.out.println(data1);
		System.out.println(data2);
	}
}

Class

  • 공통 요소들을 '추상'적으로 묶어놓은 틀(붕어빵 틀)
  • 여러 변수들과 메소드들을 둘 다 쉽게 관리하고 사용하기 위해 쓴다.

클래스란 무엇인가?

Class는 주어이다.

  • 모든 문장 맨 앞에 클래스가 나오고 영어는 맨 앞을 항상 대문자로 적는다.
    따라서 클래스는 주어이고, 대문자로 시작한다.
food = "banana";
Monkey.eat(food);
[주]  [동]  [목]

Class는 타입이다.

  • 클래스는 추상적인 개념이고 이 클래스 안에는 필드가 존재한다. 추상적인 것을 바로 사용할 수없기 때문에 그 필드들을 구체화시킬 대상이 필요하다.
    이러한 것들을 '객체'라고 부르고 영어로는 instance variable이라고 부른다.
    instance는 예, 예시라는 뜻이고 추상적인 개념의 한 예시로써 객체가 나오기 때문에 instance variable라고 부든다.
    (자동차인데 예를들어 내차 말이야)
    [클래스]                 [객체]

  • 추상적인 개념인 클래스를 개체로 구체화 해서 만드는 작업을 개체화라고 하며 instance화라고 한다.

				클래스명 객체명;
				String msg;
                위 String도 하나의 타입임으로 
				클래스도 그 객체의 타입이다.

클래스 선언

다른 클래스 외부에서 선언한다.

class 클래스명 {
	필드 선언(변수, 메소드)
}

package day08;

public class ClassTest {
	public static void main(String[] args) {
		//메인 메소드의 필드
	}
}
//클래스 선언
class Car{
	//클래스 안에다가 필드를 작성한다.
	String brand;

	void engineStart() {
		System.out.println("시동 켜기");
	}
};

클래스 사용

클래스는 추상적인 틀이기 때문에 먼저 객체화를 진행한다.
클래스명 객체명 = new 클래스명();
객체.변수
객체.메소드()

하나의 저장공간에는 단 한개의 값만 담을 수 있다.
필드에는 여러개의 값이 존재하기 때문에 필드는 다른곳(heap메모리)에 할당되고
할당된 필드의 주소값을 기억하는 것이 객체이다.


package day08;

public class ClassTest {
	public static void main(String[] args) {
		//클래스를 사용하기 위해는 객체화를 해야한다.
        Car mycar = new Car();
        mycar.brand = "현대";
        System.out.println(mycar.brand); //현대라고 출력된다.
        mycar.enginStart(); // 바로 메소드가 실행되면서 시동켜기를 출력
        
	}
}
//클래스 선언, 아직 추상적인 개념으로 남아있다. 
class Car{
	//클래스 안에다가 필드를 작성한다.
	String brand;

	void engineStart() {
		System.out.println("시동 켜기");
	}
};

생성자

  • 클래스 이름 뒤에 소괄호
    생성자는 메소드와 똑같은 기능을 가지고 있다.
    생성자는 리턴을 할 수 없기 때문에 메소드라고 부르지 않는다.
  • 클래스 선언 시 자동으로 생성자가 하나 만들어지고 코드 상에는 나타나지 않는다.
    이런 생성자를 기본 생성자라고 하며 만약 직접 생성자를 선언하게 되면 기존에 있던 기본 생성자는 사라진다.
  • 생성자를 활용해서 객체화 하면서 초기화 할때 변수에 값을 할당할수 있다.
package day08;

public class ClassTest {
	public static void main(String[] args) {
		//클래스를 사용하기 위해는 객체화를 해야한다.
        //기본 생성자를 재정의 하였음으로 매개변수를 작성한다.
        Car mycar = new Car("포르쉐", "white", 15000);
       	System.out.println(mycar.brand); //포르쉐가 정상적으로 출력된다. 
        System.out.println(mycar.color); // white;
		System.out.println(mycar.price); // 15000;
    }
}
//클래스 선언, 아직 추상적인 개념으로 남아있다. 
class Car{
	//클래스 안에다가 필드를 작성한다.
	String brand;
    String color;
	int price;
    
    //기본 생성자를 건든다., 매개변수를 만들어 값을 할당하도록 하였다.
    Car(String a, String b, int c){
    	brand = a;
        color = b;
        price = c;
    }
    
	void engineStart() {
		System.out.println("시동 켜기");
	}
    void engineStop() {
		System.out.println("시동 끄기");		
	}
};

그러나 기본생성자를 만들때 위처럼 변수에 a와 b, c처럼 표현하지않고 변수명을 명확하게 작성한다. 그러기 위해서는 this가 필요하다.

package day08;

public class ClassTest {
	public static void main(String[] args) {
		//클래스를 사용하기 위해는 객체화를 해야한다.
        //기본 생성자를 재정의 하였음으로 매개변수를 작성한다.
        Car mycar = new Car("포르쉐", "white", 15000);
       	System.out.println(mycar.brand); //포르쉐가 정상적으로 출력된다. 
        System.out.println(mycar.color); // white;
		System.out.println(mycar.price); // 15000;
    }
}
//클래스 선언, 아직 추상적인 개념으로 남아있다. 
class Car{
	//클래스 안에다가 필드를 작성한다.
	String brand;
    String color;
	int price;
    
    //기본 생성자를 건든다., 매개변수를 만들어 값을 할당하도록 하였다.
    Car(String brand, String color, int price){
    //this는 이 클래스를 가르킨다. this.brand는 이 클래스의 brand 즉, 전역변수 brand이다. 
    //그냥 brand는 기본 생성자의 매개변수를 뜻한다.
    	this.brand = brand;
        this.color = color;
        this.price = price;
    }
    
	void engineStart() {
		System.out.println("시동 켜기");
	}
    void engineStop() {
		System.out.println("시동 끄기");		
	}
};

다음 시간에 계속.

좋은 웹페이지 즐겨찾기