1) Scanner 객체명 = new Scanner(System.in) 으로 스캐너클래스 호출
2) printf, println등의 메소드로 입력받을 값에 대한 설명을 출력
3) 변수형 변수 = 객체명.next변수형 으로 입력받은 값을 변수에 대입
2개 이상을 입력받아야 할 경우 2, 3번을 입력받을 횟수만큼 반복.
예) hp값과 mp값을 입력받아 각각 저장
Scanner scanner = new Scanner(System.in);
System.out.printf("hp를 입력해주세요: ");
int hp = scanner.nextInt();
System.out.printf("mp를 입력해주세요: ");
int mp = scanner.nextInt();
int num = 5;
String jumsu = (num < 3) ? "num은 3보다 작다" : "num은 3보다 크다";
System.out.println(jumsu);
// A && B => A, B 모두 true일 때만 true
boolean isRaining = false; // 비가 오는가?
boolean haveUmbrella = true; // 우산을 가지고 있는가?
boolean takeUmbrella = false; // 우산을 쓰나?
// 1번 작성법 - 다중 if문
if(isRaining) {
if(haveUmbrella) {
takeUmbrella = true;
}
}
System.out.println("첫번째 : " + takeUmbrella);
// 2번 작성법 - if문에 && 연산자 사용
if(isRaining && haveUmbrella) {
takeUmbrella = true;
}
System.out.println("두번째 : " + takeUmbrella);
// 3번 작성법 - 삼항 연산자에 && 연산자 사용
takeUmbrella = isRaining && haveUmbrella ? true : false;
System.out.println("세번째 : "+ takeUmbrella);
// A || B => 둘 중에 하나라도 true 이면 true
boolean isRaining = false; // 비가 오는가?
boolean mightRain = true; // 비가 올 수도 있나?
boolean takeUmbrella = false; // 우산을 쓰나?
takeUmbrella = isRaining || mightRain;
System.out.println(takeUmbrella);
or와 and를 함께 사용할 수도 있음
// && 와 || 를 합쳐서 사용
boolean isRaining = false; // 비가 오는가?
boolean mightRain = true; // 비가 올 수도 있나?
boolean haveUmbrella = false; // 우산을 가지고 있나?
// 1번 방법 - 하나의 if조건에서 차례로 비교
if((isRaining || mightRain) && haveUmbrella) { // or연산 후 and연산
System.out.println("우산을 쓴다");
}
else {
System.out.println("우산을 쓰지 않는다");
}
// 2번 방법 - 두 개 먼저 비교 후 결과를 나머지 하나와 비교
boolean rainCheck = isRaining || mightRain; // 둘 중 하나라도 true이면 true
if(rainCheck && haveUmbrella) { // 둘 다 true일때만 true
System.out.println("우산을 쓴다");
}
else {
System.out.println("우산을 쓰지 않는다");
}
- Cat.class -
public class Cat {
private String name; // 이름
private int id; // 아이디(고유번호, 중복불가)
// static 상수(변하지 않는 수)
public static final String FOOD = "고양이 사료"; // final이 붙으면 변수명을 대문자로 지정한다
// static 변수 : 객체들에 공유됨
public static int count = 0; // 초기값 0
public Cat(String name) {
this.name = name;
count++;
id = count; // 객체가 만들어질때마다 카운트가 증가하면서 저장됨
}
public static int getCount() {
// static 메소드는 일반 인스턴스(객체) 변수 사용불가
// String s = name; // 객체가 만들어지기 전에 이미 사용가능하므로 인스턴스 변수는 사용할 수 없다
return count; // static변수인 count는 사용가능
}
@Override
public String toString() {
return "Cat [이름= " + name + ", id= " + id + "]";
}
}
- App.class -
public class App {
public static void main(String[] args) {
// static 변수는 클래스명.변수 로 객체 생성없이 사용(= 객체없이 클래스명으로 바로 사용)
System.out.println(Cat.FOOD);
System.out.println(Math.PI); // 객체를 생성할 필요없이 미리 지정되어있는 static메소드를 불러 사용
System.out.println(Cat.count); // static 변수는 객체와 관계없이 클래스명을 생성하면 메모리에 올라감, 초기값인 0
Cat cat1 = new Cat("마틸다"); // 객체를 생성할때마다 Cat메소드가 사용되면서 count값이 ++됨
System.out.println(Cat.getCount()); // static메서드는 객체를 불러오지않고 바로 클래스명으로 사용가능
// getCount() 메서드가 static메서드가 아니면 cat1.getCount() 로 호출해야함
Cat cat2 = new Cat("라이언");
System.out.println(Cat.getCount());
System.out.println(cat1);
System.out.println(cat2.toString());
Cat cat3 = new Cat("울버린");
System.out.println(Cat.getCount());
System.out.println(cat3.toString());
}
}
static 메서드 (클래스 메서드)
class MyMath2 {
// 인스턴스 변수와 관계없이 매개변수만으로 착업 가능
static long add(long a, long b) { return a + b; };
static long subtract(long a, long b) { return a - b; };
static long multiply(long a, long b) { return a * b; };
static double divide(long a, long b) { return a / (double)b; };
}
public class StaticMethodCompare {
public static void main(String[] args) {
// 클래스 매서드 호출. 인스턴스 변수 생성없이 호출가능
System.out.println(MyMath2.add(200L, 100L));
System.out.println(MyMath2.subtract(200L, 100L));
System.out.println(MyMath2.multiply(200L, 100L));
System.out.println(MyMath2.divide(200L, 100L));
}
}
인스턴스 메서드
class MyMath2 {
long a, b;
// 인스턴스 변수 a, b 만을 이용해서 작업하므로 매개변수가 필요없다
long add() { return a + b; };
long subtract() { return a - b; };
long multiply() { return a * b; };
double divide() { return a / b; };
}
public class StaticMethodCompare {
public static void main(String[] args) {
MyMath2 mm = new MyMath2(); // 인스턴스(객체) 생성
mm.a = 200L;
mm.b = 100L;
// 인스턴스 메서드는 객체생성 후에만 호출가능
System.out.println(mm.add());
System.out.println(mm.subtract());
System.out.println(mm.multiply());
System.out.println(mm.divide());
}
}
public class Ex6_3 {
public static void main(String[] args) {
// 클래스 변수와 인스턴스 변수
System.out.println("Card.width = " + Card.width);
System.out.println("Card.width = " + Card.height);
Card c1 = new Card();
c1.kind = "Heart"; // 인스턴스 변수 값 변경
c1.number = 7;
Card c2 = new Card();
c2.kind = "Spade";
c2.number = 4;
System.out.println("c1은 " + c1.kind + " " + c1.number + "이며, 크기는 ("+ c1.width + ", " + c1.height + ")");
System.out.println("c2는 " + c2.kind + " " + c2.number + "이며, 크기는 ("+ c2.width + ", " + c2.height + ")");
System.out.println();
System.out.println("c1의 width와 height의 값을 50, 80으로 변경한다.");
c1.width = 50;
c1.height = 80;
System.out.println("c1은 " + c1.kind + " " + c1.number + "이며, 크기는 ("+ c1.width + ", " + c1.height + ")");
System.out.println("c2는 " + c2.kind + " " + c2.number + "이며, 크기는 ("+ c2.width + ", " + c2.height + ")");
// Card.width, c1.width, c2.width는 모두 같은 저장공간을 참고하므로 항상 같은 값을 갖는다.
// 고로 c1.width, c1.height의 값만 바꿔도 c2.width, c2.height 값 역시 모두 변경된 값으로 나옴.
}
}
class Card {
String kind; // (무늬) 인스턴스 변수 생성
int number; // (숫자)
static int width = 100; // (폭) 클래스 변수 생성
static int height = 250; // (높이)
}
'변경될 수 없는', '마지막의'라는 의미를 가지며 다양한 대상에 사용된다.
변경될 수 없는 클래스, 확장할 수없는 클래스가 됨.
final로 지정된 클래스는다른 클래스의 부모가 될 수 없다.
변경될 수 없는 메서드가 됨.
final로 지정된 메서드는 오버라이딩을 통해 재정의가 불가능함.
변수의 앞에 final이 붙으면 값을 변경할 수 없는 상수가 됨.
이때 상수는 관례적으로 모두 대문자로 작성.
public class Cat {
// static 상수(변하지 않는 수)
public static final String FOOD = "고양이 사료"; // final이 붙으면 변수명을 대문자로 지정한다
}
public class App {
public static void main(String[] args) {
// static 변수는 클래스명.변수 로 객체 생성없이 사용(= 객체없이 클래스명으로 바로 사용)
System.out.println(Cat.FOOD);
}
}