언어 공부 내용 정리/Java

객지프 중간대비 복습자료

wosrn 2023. 7. 7. 18:16
  • 자바에서 메소드는 클래스 바깥에 작성할 수 없음
  • 기본타입 vs 레퍼런스 타입 : 기본타입은 메모리 공간에 변수 공간이 생기면서 값이 바로 같이 대입되는 반면, 레퍼런스 타입은 메모리에 값이 바로 저장되는게 아니라 주소값이 저장되고 그 주소값으로 찾아 들어가야 실제 값이 저장되어 있는 형식
  • 문자타입 : char(2바이트) 
  • 정수타입: byte(1바이트, -128-127), short(2바이트, -32768-32767), int(4바이트), long(8바이트, 리터럴 뒤에 L붙여야함) / 정수의 기본 컴파일 타입은 int
  • 실수타입 : float(4바이트, 리터럴 뒤에 f붙이기), double(8바이트) / 실수 기본 컴팡리 타입은 double
  • 문자열 연결에는 더하기 연산자 사용이 가능함
  • 변수의 선언과 할당(초기화) 구분하기 (선언과 할당 동시에 할수도 있고 따로 할수도 있음)
  • 정수 리터럴 : 15(10진수) 015(0으로 시작하면 8진수, 십진수로 13) 0x15(0x으로 시작하면 16진수, 십진수로 21), ob0101(0b로 시작하면 2진수, 십진수로 5)
  • 정수 리터럴은 int 형으로, 실수 리터럴은 모두 더블로 컴파일된다
  • 문자 리터럴 : 단일 인용부호로 표현하거나 \u다음에 문자의 유니코드 값(16진수)사용하여 표현
  • char c = \u0041; 은 char c = 'A'와 같음 (0041이 A의 유니코드값)
  • 특수문자 리터럴 : \(백슬래시)  뒤에 특수기호를 붙여서 표현, 이스케이프 시퀀스라고 부름
기본타입 모음, 기본타입은 모두 소문자로 시작
꼭 기억할건 \n , \", \', \\
  • 꼭 기억할 건 \n(줄바꿈) , \", \', \\
  • null 리터럴 : 기본타입에 사용할 수 없고 객체 레퍼런스에만 대입하여 사용 (String 등에 사용 가능)
  • 문자열 리터럴 : " " 부호로 묶어 표현
  • 숫자에 _ 허용됨 , 단 리터럴 끝, 소수점 앞뒤, L(F)앞에는 사용 불가
  • 0x중간이나 끝에 사용 불가
  • var 키워드를 사용하여 변수 타입을 생략하고 선언 가능 : 지역 변수의 선언에만 사용, 변수 선언문에 반드시 초기값을 지정해야함(정수는 int로 실수는 double 타입으로 결정)
  • 상수 : 상수 이름은 모든 글자, final 키워드 사용, 선언 시 초기값 지정, 실행 중 값 변경 불가
  • 자동 타입 변환 : 치환문(=)이나 수식(계산식)내에서 피연산자들의 타입이 일치하지 않을 때작은 타입-> 큰 타입은 컴파일러에 의해 자동으로 변환됨 
  • 강제 타입 변환(캐스팅) : 큰 타입-> 작은 타입은 자동으로 변환되지 않음(ex)byte b = 300;) => (변환할 형)변환할 변수 로 강제형변환 가능 / 값 손실 우려 있음(소수점 밑 값 다 버림)
  • 특수문자 리터럴, 정수(8진수 16진수 등 포함) 모두 기본 타입의 리터럴, String은 기본타입 리터럴 아님
  • Scanner 클래스 ; System.in 에게 키를 읽게 하고, 읽은 바이트를 다양한 타입으로 변환하여 자바 응용 프로그램에 리턴하는 역할
  • \t’(탭), ‘\f’, ‘\r, ‘ ’, ‘\n’(줄바꿈) 의 공백문자 단위로 읽음
nextLine만 주의하기(공백 먹어가기 코드)

<초 단위 정수 입력받아 몇 시간 몇 분 몇 초인지 출력하는 프로그램>

package 객지프;
import java.util.Scanner;
//몇시간 몇분 몇초 , 1시간은 3600초 1분은 60초
public class ch3_1 {

	public static void main(String[] args) {
		Scanner a = new Scanner(System.in);
		System.out.println("초 단위의 정수를 입력하세요");
		int sec = a.nextInt();
		int time = sec / 3600; //sec/60/60 (초를 60으로 나눈 몫을 60으로 나눈 몫)
		int min = (sec%3600)/60; //(sec/60)%60 초를 60으로 나눈 몫(분이 될 수 있는 것들)을 60으로 나눈 나머지(시간이 안되는 것들)
		int secc = sec%3600%60; //sec%60 : 1분으로만 나눠져도 분으로 넘어가서 !!
		
		System.out.println(time +" "+min+" "+secc); //변수 세개 출력하고 싶다고 연달아 띄어쓰기로만 구분하면 에러
		
	}

}
  • 증감연산 : a++ vs ++a : a를 반환하고 1 증가 vs a를 1 증가하고 증가된 값 반환
  • 대입연산
  • System.out.prinf("평균은 %.3f" , avr); -> 소수점 n째자리까지만 출력하는 법 ! 쓸 일은 없겟지만,,

 

비교연산 논리연산 - 다 반환값이 boolean

 
 

&gt;&gt;은 나누기 2, &lt;&lt;은 곱하기 2 하는 효과 !

<주의점>

  • scanner 쓰면 close 해주기 - 메인 메소드 안 맨 마지막 문장에
  • switch문 -> switch(기준값){ case : 실행문 ; break; .. default: 실행문} 형태 ! break잊지말기 / 정수,문자,문자열 리터럴을 값으로 사용 가능
  • 클래스 만들때 꼭 main메소드 자동으로 만드는거 체크하기
  • 시험날 가면 소스파일 넣을 폴더 만들어서 빼두기 -> 연습 하고가기
  • 문자열 비교는 == 아니고 .equals !!!
  • 무한루프 쓰라고 하면 조건식에 true 써야함
  • 틀려도 당황하지 말기
  • 빨리 하려고 하면 타이핑 버벅거리게 돼서 더 오래걸림 => 차분히 !!
  • do-while 문 : do{ 실행문} while(조건);
  • 구구단 출력시에 탭으로 공백 구분하면 가지런하게 나옴
  • 삼항 연산자 : condition ? op2 : op3 =>출력문이나 변수에 넣어서 씀
  • xor연산은 피연산자 두개가 같을때만 false
  • 중첩반복 헷갈리면 안의 반복문(출력 첫줄 한줄) 먼저 작성 ! 

 

브레이크문이 없어서 oprion1일 때 케이스 1부터 케이스3까지 출력하게 됨
//do-while문으로 0 전까지 입력된 정수 평균 구하기
public class hw01 {

	public static void main(String[] args) {
     Scanner sc = new Scanner(System.in);
     System.out.println("정수 입력 후 마지막에 0 입력하세요");
     int i = sc.nextInt();
     int add = 0;
     int num=0;
	 do { 
		
		// i = sc.nextInt();
		 add += i;
		 num +=1;
		 i = sc.nextInt();
		 
	 }while(i!=0);
      System.out.println("개수는 "+num +" "+"평균은 "+((double)add/num));
      
      sc.close();
	}

}

<do-while문 주의점> ! 작업문 실행 후 조건식을 따진다는 점 유의하기 !
최초1회 무조건 실행 -> 조건문 참이면 또 실행->그 실행값으로 조건문 판단해서 참이면 또 실행 >.. 의 패턴임
그렇기에 i 가 0일때가 num에 포함되지 않게 하려면 새 i를 마지막에 입력 받아야함(올바른 조건문 동작을 위해)
 

같은 문제 while문 버전

오른쪽 정렬 별찍기

 
 

exit 입력해야 종료되는 프로그램 ! 특정 값 나올때까지 계속 반복되는 프로그램은 무한루프 떠올리기
 
 

continue문 사용예시

 
 

내 쥐약같은 부분인 가운데 정렬 별찍기...
for문 없이 do-while문 만으로 구구단 출력하기 !&amp;nbsp; i++이 do 바디의 마지막 줄인게 포인트
1-25까지 직사각형 모양으로 5개씩 끊어서 출력하기