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;
}
지역 변수 | 전역 변수 | 정적 변수 | |
---|---|---|---|
초기화 | 직접 | 자동 | 자동 |
생명주기 | { } | 프로그램 종료전 | 프로그램 종료전 |
접근성 | 하 | 중 | 상 |
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);
}
}
food = "banana";
Monkey.eat(food);
[주] [동] [목]
클래스는 추상적인 개념이고 이 클래스 안에는 필드가 존재한다. 추상적인 것을 바로 사용할 수없기 때문에 그 필드들을 구체화시킬 대상이 필요하다.
이러한 것들을 '객체'라고 부르고 영어로는 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("시동 끄기");
}
};
다음 시간에 계속.