Algorithms/Java

Java: 쉽게 배우는 자바2 정리

Jenn28 2023. 1. 19. 17:32

1.2 Boolean Datatype

public class BooleanApp {
	public static void main(String[] args) {
		String foo="Hello world";
		System.out.println(foo.contains("world"));
		System.out.println(foo.contains("egoing"));
	}
}

- a.contains("b"): a에 b가 포함되어있는지 없는지 확인 

 

1.4.2 조건문 응용1

public class AuthApp {
	public static void main(String[] args) {
		System.out.println(args[0]);
		
		String id="egoing";
		String inputId=args[0];
		
		System.out.println("Hi.");
		
		if(inputId.equals(id)) {
			System.out.println("Master!");
		} else {
			System.out.println("Who are you?");
		}
	}
}

- .equals()는 내용 자체를 비교

- ==는 메모리 주소값을 비교

 

1.4.3 조건문 응용2

public class AuthApp {
	public static void main(String[] args) {
		System.out.println(args[0]);
		
		String id="egoing";
		String inputId=args[0];
		
		String pass="1111";
		String inputPass=args[1];
		
		System.out.println("Hi.");
		
//		if(inputId.equals(id)) {
//			if(inputPass.equals(pass)) {
//				System.out.println("Master!");
//			} else {
//				System.out.println("Wrong password!");
//			}
//		} else {
//			System.out.println("Who are you?");
//		}
		
		if(inputId.equals(id) && inputPass.equals(pass)) {
				System.out.println("Master!");
			} else {
			System.out.println("Who are you?");
		}
	}
}

 

1.6 논리연산자

- &&: AND

- ||: OR

- !true/!false: 반대로

public class AuthApp2 {
	public static void main(String[] args) {
		String id="egoing";
		String inputId=args[0];
		
		String pass="1111";
		String pass2="2222";
		String inputPass=args[1];
		
		System.out.println("Hi.");
		
		boolean isRightPass=(inputPass.equals(pass) || inputPass.equals(pass2));
		
		if(inputId.equals(id) && isRightPass) {
				System.out.println("Master!");
			} else {
			System.out.println("Who are you?");
		}
	}
}

 

1.7.1 반복문

public class LoopApp {
	public static void main(String[] args) {
		System.out.println("=== while ===");
		int i=0;
		while(i<3) {
			System.out.println(2);
			System.out.println(3);
			//i=i+1;
			i++;
		}
		
		System.out.println("=== for ===");
		for(int j=0; j<3; j++) {
			System.out.println(2);
			System.out.println(3);
		}
	}
}

- i=i+1 대신 i++ 사용

 

1.7.2 배열

public class ArrayApp {
	public static void main(String[] args) {
		String[] users = new String[3];
		users[0]="egoing";
		users[1]="jinhuck";
		users[2]="youbin";
		
		System.out.println(users[1]);
		System.out.println(users.length); //세칸짜리 배열
		
		int[] scores = {10, 100, 100};
		System.out.println(scores[1]);
		System.out.println(scores.length);
		
		String[] scores2 = {"a", "b", "c"};
		System.out.println(scores2[1]);
	}
}

- 자료 담기 여러 방법 있는데 {} 이용해 한꺼번에 담기 가능. 맨 위는 변수 많을 시 비효율적

 

1.7.3 반복문+배열

public class LoopArray {
	public static void main(String[] args) {
		String[] users = new String[3];
		users[0]="egoing";
		users[1]="jinhuck";
		users[2]="youbin";
		
		for(int i=0; i<users.length; i++) {
			System.out.println(users[i]+",");
		}
	}
}

- users.length 사용함으로써 유동적으로 반복 횟수 설정 가능

 

1.8.2 종합응용2

public class AuthApp3 {
	public static void main(String[] args) {
		String[][] users= {
				{"egoing", "1111"},
				{"jinjuck", "2222"},
				{"youbin", "3333"}
		};
		
		String inputId=args[0];
		String inputPass=args[1];
		
		boolean isLogined=false;
		for(int i=0; i<users.length; i++) {
			String[] current=users[i];
			if(current[0].equals(inputId) && current[1].equals(inputPass))
			{
				isLogined=true;
				break;
			}
		}
		
		if(isLogined) {
			System.out.println("Master!!");
		} else {
			System.out.println("Who are you?");
		}
	}

}

 

2.3 메소드의 기본 형식

public class FirstMethod {
	public static void main(String[] args) {
		printTwoTimesA();
		printTwoTimesA();
		printTwoTimesA();
	}
	
	public static void printTwoTimesA() {
		System.out.println("-");
		System.out.println("A");
		System.out.println("A");
	}
}

- 함수같이 쓰임

- 순서 상관없이 선언해줘야 사용 가능

 

2.4 메소드의 입력

public class FirstMethod {
	public static void main(String[] args) {
		printTwoTimes("a", "-");
		printTwoTimes("a", "*");
		printTwoTimes("a", "&");
		printTwoTimes("b", "!");
	}
	
	public static void printTwoTimes(String text, String delimiter) {
		System.out.println(delimiter);
		System.out.println(text);
		System.out.println(text);
	}
}

 

2.5 메소드의 출력

public class OutputMethod {
	public static String a() {
		return "a";
	}
	public static int one() {
		return 1;
	}

	//return 값이 없을 때는 void 사용
	public static void main(String[] args) {
		System.out.println(a());
		System.out.println(one());
	}
}

 

2.6 메소드의 활용

public class AccountingApp {
	public static double valueOfSupply=10000.0;
	public static double vatRate=0.1;
	
	public static double getVAT() {
		return valueOfSupply*vatRate;
	}	
	public static double getTotal() {
		return valueOfSupply+getVAT();
	}

	public static void main(String[] args) {
		double vat=getVAT();
		double total=getTotal();
		
		System.out.println("Value of supply: "+valueOfSupply);
		System.out.println("VAT: "+vat);
		System.out.println("Total: "+total);
	}
}

 

3.2 남의 클래스 남의 인스턴스

import java.io.FileWriter;
import java.io.IOException;
 
public class OthersOOP {
    public static void main(String[] args) throws IOException {
        // class : System, Math, FileWriter
        // instance : f1, f2
         
        System.out.println(Math.PI);
        System.out.println(Math.floor(1.8));
        System.out.println(Math.ceil(1.8));
         
        FileWriter f1 = new FileWriter("data.txt");
        f1.write("Hello");
        f1.write(" Java");
         
        FileWriter f2 = new FileWriter("data2.txt");
        f2.write("Hello");
        f2.write(" Java2");
        f2.close();
         
        f1.write("!!!");
        f1.close();
    }
}

- Math라는 클래스는 바로 사용할 수 있고, Filewriter도 클래스이지만 new를 추가해서 f1이라는 변수에 담기는 복제본을 생성, 그 복제본은 내부적으로 data.txt라는 파일에 내용을 저장

- 짧게 작업을 끝내면 되는 것은 그냥 메소드나 변수를 클래스에 소속된 것 그대로 사용

- 긴 작업인 경우에는 클래스를 직접 사용하는 것이 아니라 클래스를 복제해서 f1이라는 변수를 제어

 

3.3 변수와 메소드

public class MyOOP {
	public static String delimiter="";
	
	public static void main(String[] args) {
		delimiter="----";
		printA();
		printA();
		printB();
		printB();

		delimiter="****";
		printA();
		printA();
		printB();
		printB();
	}

	public static void printA() {
		System.out.println(delimiter);
		System.out.println("A");
		System.out.println("A");
	}

	public static void printB() {
		System.out.println(delimiter);
		System.out.println("B");
		System.out.println("B");
	}
}

- MyOOP 아래에 선언해주면 전체적으로 사용 가능

 

3.4.1 클래스 존재 이유와 기본 형식

class Print{
	public static String delimiter="";
	public static void A() {
		System.out.println(delimiter);
		System.out.println("A");
		System.out.println("A");
	}

	public static void B() {
		System.out.println(delimiter);
		System.out.println("B");
		System.out.println("B");
	}
}

public class MyOOP {
	public static void main(String[] args) {
		Print.delimiter="----";
		Print.A();
		Print.A();
		Print.B();
		Print.B();

		Print.delimiter="****";
		Print.A();
		Print.A();
		Print.B();
		Print.B();
	}
}

- 구분자로 분리된 A 문자열과 B 문자열을 출력하는 메소드를 Print라는 클래스로 따로 떼어내기 가능. 그래서 굳이 메소드의 이름을 printA라고 적지 않고 A라고만 적어도 Print 객체의 A메소드이기 때문에 A를 출력한다는 의미를 쉽게 알 수 있음

 

3.5 인스턴스

class Print{
	public String delimiter="";
	public void A() {
		System.out.println(delimiter);
		System.out.println("A");
		System.out.println("A");
	}

	public void B() {
		System.out.println(delimiter);
		System.out.println("B");
		System.out.println("B");
	}
}

public class MyOOP {
	public static void main(String[] args) {
		Print p1=new Print();
		p1.delimiter="----";
		p1.A();
		p1.A();
		p1.B();
		p1.B();
		
		Print p2=new Print();
		p2.delimiter="****";
		p2.A();
		p2.A();
		p2.B();
		p2.B();
	}
}

- 인스턴스는 클래스의 복제본이라 볼 수 있는데, 클래스 안의 데이터가 다른 클래스를 이용하고 싶을때 간단하게 복제해서 초기값세팅후 변경없이 사용 가능

- 위에서 A(), B() 선언할 때 static은 지워야함

 

3.6 static (어려움)

class Foo{
    public static String classVar = "I class var";
    public String instanceVar = "I instance var";
    public static void classMethod() {
        System.out.println(classVar); // Ok
//      System.out.println(instanceVar); // Error
    }
    public void instanceMethod() {
        System.out.println(classVar); // Ok
        System.out.println(instanceVar); // Ok
    }
}
public class StaticApp {
 
    public static void main(String[] args) {
        System.out.println(Foo.classVar); // OK
//      System.out.println(Foo.instanceVar); // Error
        Foo.classMethod();
//      Foo.instanceMethod();
         
        Foo f1 = new Foo();
        Foo f2 = new Foo();
//      
        System.out.println(f1.classVar); // I class var
        System.out.println(f1.instanceVar); // I instance var
//      
        f1.classVar = "changed by f1";
        System.out.println(Foo.classVar); // changed by f1
        System.out.println(f2.classVar);  // changed by f1
//      
        f1.instanceVar = "changed by f1";
        System.out.println(f1.instanceVar); // changed by f1
        System.out.println(f2.instanceVar); // I instance var
    }
}

- 클래스 static 메소드: 객체 생성 없이 호출 가능, 메소드 내 인스턴스 변수 사용 불가

- 인스턴스 메소드: 객체 생성 후 호출 가능, 메소드 내 인스턴스 변수 사용 가능

- 클래스는 클래스를 사용 가능, 인스턴스는 인스턴스를 통해 사용되도록 고안된 것