자바수업 5일차

하파타카·2021년 11월 30일
0

JAVA수업

목록 보기
5/10
post-thumbnail

한 일

  • Scanner 객체로 사용자에게서 입력받기
  • 삼항 연산자
  • 조건 연산자(&&, ||)
  • static
  • final

Scanner 객체로 사용자에게서 입력받기

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();

삼항 연산자

  • 3개의 피연산자를 필요로 하는 연산자. 조건 연산식으로 불리기도 함.
  • 조건 ? A : B
    조건이 true이면 A를, false이면 B를 반환
int num = 5;
String jumsu = (num < 3) ? "num은 3보다 작다" : "num은 3보다 크다";
System.out.println(jumsu);

조건 연산자 (boolean) Ch08_Boolean

and 연산자

  • A && B
    A, B 모두 true일때만 true를 반환.
// 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);

or 연산자

  • A || B
    A, B 둘 중 하나라도 true이면 true를, 둘 모두 false이면 false를 반환.
// 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("우산을 쓰지 않는다");
}

static Ch09_Static

  • '클래스의', '공통적인'의 의미를 가지고 있음.
  • 인스턴스 변수는 하나의 클래스로부터 생성되었더라도 각각 다른 값을 유지하지만 클래스 변수(static멤버변수)는 인스턴스에 관계없이 값을 갖는다.
    => 하나의 변수를 모든 인스턴스가 공유하기 때문.

static 변수

  • 모든 인스턴스에 공통적으로 사용되는 클래스 변수가 됨.
  • 클래스 변수는 인스턴스(객체)를 생성하지 않고도 사용가능.
  • 클래스가 메모리에 로드될 때 생성됨.

static 메서드

  • '클래스명.static메서드명' 으로 사용.
  • 일반적으로 객체.메서드로 접근하는것이 아닌 클래스를 통해 접근한다.
    즉, 객체생성없이 클래스명으로 바로 사용.

- 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메서드와 인스턴스 메서드 ~

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());
	}
}

~ 클래스 변수(static)와 인스턴스 변수 ~

  • 인스턴스 변수: 인스턴스가 생성될 때마다 생성되므로 인스턴스마다 각각 다른 값을 유지할 수 있다.
  • 클래스 변수: 모든 인스턴스가 하나의 저장공간을 공유하므로, 항상 공통된 값을 갖는다.
    인스턴스를 생성하지 않고도 클래스명.클래스변수 의 방식으로 사용가능.
    => 즉, 하나의 값만 바꿔도 같은 저장공간을 공유한다면 모두 값이 바뀜. 아래 예제참고.
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로 지정된 클래스는다른 클래스의 부모가 될 수 없다.

final 메서드

변경될 수 없는 메서드가 됨.
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);
    }
}

profile
천 리 길도 가나다라부터

0개의 댓글

관련 채용 정보