1년을 일, 시간, 분, 초로 출력하시오. 출력 할 것 -> 1년은 365일 x시간 x분 x초 입니다.
정답
package kr.or.ddit.homework;
public class HomeWork1 {
public static void main(String[] args) {
// 1년은 365.2422 일이다.
// 출력 할 것 -> 1년은 365일 x시간 x분 x초 입니다.
double day = 365.2422;
int days = (int)day; // 365일
day = day - days;
int hour = (int)(day*24); // 5시간
day = day*24 - hour;
int minute = (int)(day*60); // 48분
day = day*60 - minute;
int second = (int)(day*60); // 46초
System.out.println("1년은 " + days + "일 " + hour + "시간 " + minute + "분 " + second + "초 입니다.");
}
}
package kr.or.ddit.study02.sec02;
public class IntergerExample {
public static void main(String[] args) {
IntergerExample obj = new IntergerExample();
obj.intExample();
}
public void byteExample() {
/*
* byte : 1byte (127 ~ -128)
* (8bit 2^8)
*/
byte b1 = 127;
System.out.println("b1 = " + b1);
// byte b2 = 128; // 컴파일 에러
// b1 = b1 + 1; // 자바는 기본적으로 int type으로
// byte < int 크기가 차이 나기 때문에 담을 수 없다.
}
}
- short 타입
: 2byte (32767 ~ -32768)
16bit (2^16)
package kr.or.ddit.study02.sec02;
public class IntergerExample {
public static void main(String[] args) {
IntergerExample obj = new IntergerExample();
obj.shortExample();
}
public void shortExample() {
/*
* short : 2byte(32767 ~ -32768)
* (16bit 2^16)
*/
short s1 = 100;
System.out.println("s1 = " + s1);
short s2 = (short)(s1 + 100); // short를 사용하기 위해서 앞에 (short)를 기입하여 코딩해야함.
System.out.println("s2 = " + s2);
}
}
- int 타입
: 기본 정수형
4byte
32bit (2^32)
package kr.or.ddit.study02.sec02;
public class IntergerExample {
public static void main(String[] args) {
IntergerExample obj = new IntergerExample();
obj.intExample();
}
public void intExample() {
/*
* int : 4byte(32bit 2^32)
* 기본 정수형
*/
int i1 = 100;
System.out.println("i1 = " + i1);
int i2 = i1 + 100;
System.out.println("i2 = " + i2);
}
}
- long 타입
: 8byte
64bit (2^64)
int 범위를 넘어가지 않는 값일때는 데이터 끝에 L(l)을 추가한다.
package kr.or.ddit.study02.sec02;
public class IntergerExample {
public static void main(String[] args) {
IntergerExample obj = new IntergerExample();
obj.longExample();
}
public void longExample() {
/*
* long : 8byte(64bit 2^64)
* 테이터 끝에 L(l) 을 추가
*/
// long l1 = 1000000000000L;
long l1 = 1000000000000l;
System.out.println("l1 = " + l1);
long l2 = 10000; // int 범위를 넘어가지 않으면 뒤에 L(l)을 추가하지 않아도 됨.
// System.out.println("l1 = " + l1);
}
}
- 리터럴(literal)
소스 코드에서는 2진수, 8진수, 10진수, 16진수로 나타낼 수 있다.
1. 2진수의 경우 앞에 0b 또는 0B로 시작한다.
int num1 = 0b1011; // 10진수로 11
int num2 = 0B10100; // 10진수로 20
2. 8진수의 경우 앞에 0을 기입한다.
int num = 013; // 10진수로 11
3. 16진수의 경우 0x 또는 0X로 시작하며 숫자와 A, B, C, D, E, F 또는 a, b, c, d, e, f로 구성된다.
int num1 = 0xB3; // 10진수로 179
int num2 = 0X2A0F; // 10진수로 10767
문자 타입
- char 타입
: 하나의 문자를 저장할 수 있는 타입
부호 없는 2byte 정수 (0 ~ 65535)
문자의 경우 작은 따옴표(' ')로 감싸야 하며 숫자의 경우 유니코드로 변환되어 저장된다.
package kr.or.ddit.study02.sec02;
public class CharExzmple {
public static void main(String[] args) {
// char : 부호 없는 2byte 정수 (0 ~ 65535)
// '' 작은 따옴표로 감싸며 한문자 표현 가능.
char c1 = 'A';
System.out.println("c1 = " + c1);
char c2 = 97; // a의 아스키 코드
System.out.println("c2 = " + c2);
char c3 = (char)(c2 - 32); // char + int 형을 더하기 때문에 바꿔줘야 함. char의 바이트가 int보다 작기 때문.
System.out.println("c3 = " + c3);
int i4 = 44032;
char c4 = (char)i4;
System.out.println("c4 = " + c4);
}
}
결과 화면
문자열 타입
- String 타입
: 복수 개의 글자로 구성된 타입으로 데이터 타입이 아니다.
큰 따옴표(" ")로 묶어 선언한다.
package kr.or.ddit.study02.sec02;
public class StringExample {
public static void main(String[] args) {
/*
* 문자와 문자열
*
* 문자(char) : 한글자 데이터로 ' '로 묶어 선언
* 문자열(string) : 복수개의 글자로 구성된 자료(데이터 타입은 아님)
* " "로 묶어 선언
*/
String name1 = "강감찬";
String name2 = "홍길동";
System.out.println(name1 + "\t" + name2);
String result3 = 10 + 3 + ""; // 더한 후 문자열 추가 13
String result4 = "" + 10 + 3; // 처음부터 문자열로 취급 103
System.out.println(result3);
System.out.println(result4);
}
}
결과 화면
실수 타입
- float 타입
: 4byte (1.4e-45 ~ 3.4e+38)
부호 1bit, 지수 8bit, 가수 23bit
변수 선언 후 변수 초기화 시 값의 마지막에 f(F)를 기입해야 한다.
- double 타입
: 8byte (4.94e-324 ~ 1.8e+308)
부호 1bit, 지수 11bit, 가수 52bit
자바에서는 double 타입이 기본형이다.
package kr.or.ddit.study02.sec02;
public class FloatExample {
public static void main(String[] args) {
FloatExample obj = new FloatExample();
/*
* 1. float : 4byte ( 부호 1bit 지수 8bit, 가수 23bit
* 1.4e-45 ~ 3.4e+38)
* 2. double : 8byte ( 부호 1bit 지수 11bit, 가수 52bit
* 4.94e-324 ~ 1.8e+308)
*
* 둘 다 정확한 값이 나오지 않아 하단의 코드 작성 시 다른 값으로 결과가 나온다.
* double의 경우 더 정확한 값을 나온다.
*/
float f1 = 3.141592f;
double d1 = 3.141592;
if(f1 == d1) {
System.out.println("같은 값.");
} else {
System.out.println("다른 값.");
}
}
}
결과 화면
논리 타입
: 참과 거짓을 저장하는 타입.
- boolean 타입
package kr.or.ddit.study02.sec02;
public class BooleanExample {
public static void main(String[] args) {
// 논리형 true/false
// 1byte 조건문과 제어문의 실행 흐름을 변경하는데 사용.
boolean flag = false;
System.out.println("flag = " + flag);
flag = (1<2);
System.out.println("flag = " + flag);
}
}
결과 화면
막간의 TIP
제어문자
: 인쇄 할 수 없거나 키보드로 표현할 수 없는 특별한 문자.
역슬레시(\)와 한 개의 문자와 결합하여 작성한다.
- 자주 사용하는 제어 문자
이스케이프 문자
출력 용도
\n
개행 줄바꿈, 스크린 커서 위치를 다음 줄의 처음으로 옮김. (= enter)
\t
수평탭, 스크린 커서를 다음 탭으로 옮김.
\r
캐리지 리턴, 스크린 커서의 위치를 현재줄의 처음으로 옮김. 개행하지 않는다. 이 기호 다음에 오는 문자를 덮어 씌운다.
컴퓨터 메모리(RAM)에는 값을 저장할 수 있는 수많은 번지(주소)들로 구성되어 있다. 메모리는 어디에, 어떤 방식으로 저장할지 정해놓지 않으면 개발이 불가능에 가깝게 되기 때문에 프로그래밍 언어에서는변수라는 개념을 사용한다.
변수(Variable)
값을 저장할 수 있는 메모리의 특정 번지에 붙여진 이름이다.
변수를 통해 메모리 번지 하나에 하나의 값을 저장하고 읽을 수 있다.
변수에는정수, 실수등 다양한 타입이 있으며 다양한 값을 저장할 수 있다.
변수 사용을 위해서는 변수 선언이 필요하다
변수 선언은 어떤 타입의 데이터를 저장할 것인지, 변수 이름은 무엇인지 결정하는 것을 말한다.
변수의 값을 읽거나 변경하는 것을 변수 사용이라고 하며 출력문이나 연산식 내부에서 사용되어 변수에 저장된 값을 출력하거나 연산에 사용한다.
타입 변수 이름 ;
int x;
int studentNumber;
double num;
int x, studentNumber;
위와 같은 순으로 선언해야 한다.
같은 타입의 변수의 경우 콤마를 이용해 한꺼번에 선언할 수 있다.
변수 이름을 선언할 때는 규칙이 존재한다.
- 변수 이름 규칙
1. 영문자와 숫자, 언더바(_)로 이루어져야 한다. (특수문자, 공백 사용 불가능)
2. 첫 글자는 반드시 영문 또는 언더바(_)여야 한다. (숫자로 시작 불가)
3. 대소문자를 구별한다.
4. 예약어를 사용할 수 없다. ex) if, for 사용 불가
첫 문자는 영어 소문자로 시작하되, 다른 단어가 붙을 경우 첫 문자를 대문자로 한다. (=> 카멜 표기법)
특수문자를 가장 앞에 사용하는 건 불가능 하다.
- 변수 사용 범위
자신이 선언된 위치에서 자신이 속한 블록 내부까지만 사용이 가능하다.
그 밖에서는 사용할 수 없다.
package kr.or.ddit.study02.sec01;
public class VarExample01 {
// var1과 var2는 전역 변수
static int var1 = 1; // 클래스 변수
int var2 = 2; // 멤버 변수
public static void main(String[] args) {
int var3 = 3; // 로컬 변수(지역 변수)
System.out.println(var1);
System.out.println(var3);
// System.out.println(var4); // var4를 사용할 수 없다.
VarExample01 ve = new VarExample01();
ve.test();
}
public void test() {
int var4 = 4;
System.out.println(var1);
System.out.println(var2);
// System.out.println(var3); //var3을 사용할 수 없다.
System.out.println(var4);
}
}
출력 결과
- 전역 변수와 로컬 변수 차이
1. 전역 변수
클래스 내부, 메소드 외부에서 선언된 변수
멤버 변수와 클래스 변수로 나뉨.
2. 지역변수
메서드 블럭 내에서 선언된 변수
전역 변수
지역 변수
멤버 변수
클래스 변수
선언 위치
클래스 블럭 내 선언
클래스 블럭 내 static 사용
메서드 블럭 내 선언
초기화
자동 초기화
초기화 필수
접근
클래스 내부의 모든 메서드 사용
선언된 블록 내부에서만 사용
생명주기
객체가 생성될 때 할당 객체 소멸 시 소멸
프로그램 시작 시 할당 종료 시 소멸 객체 생성 없이 사용가능
블록 내부 실행 종료 시 소멸
package kr.or.ddit.study04;
import java.util.Scanner;
// 클래스 블록 시작 {
public class IfExample {
// 클래스 범위내에 변수를 선언해서 다른 메소드에서도 사용가능
Scanner sc = new Scanner(System.in);
int i1 = 10;
// 메인 메소드 블록 시작 {
public static void main(String[] args) {
IfExample obj = new IfExample();
obj.method1();
}
// 메인 메소드 블록 끝 }
// method1 메소드 블록 시작 {
public void method1() {
// if 메소드 블록 시작 {
int i2 = 11;
System.out.println("####################");
System.out.println("전역 변수 : " + i1);
System.out.println("method1 안에 변수 : " + i2);
if(true) {
int a = 10;
System.out.println("-------------------");
System.out.println("전역 변수 : " + i1);
System.out.println("method1 안에 변수 : " + i2);
System.out.println("if문 안에 변수 : " + a);
System.out.println("-------------------");
}
// if 메소드 블록 끝 }
System.out.println("####################");
}
// method1 메소드 블록 끝 }
}
// 클래스 블록 끝 }
결과 화면
변수 초기화
변수에 최초로 값을 저장하는 걸 말하며 메모리에 변수가 생성된다.
타입 변수 이름 ;
변수 이름 = 값;
package kr.or.ddit.study02.sec01;
public class VarExample02 {
public static void main(String[] args) {
VarExample02 obj = new VarExample02();
obj.method1();
obj.method2();
}
public void method1() { // 실행을 위해선 main에서 불러와야 함
int x;
int y;
int z;
x = 10;
y = 11;
z = 12;
System.out.println("x 값은 " + x);
System.out.println("y 값은 " + y);
System.out.println("z 값은 " + z);
}
public void method2() {
int x = 10;
int y = 11;
int z = 12;
System.out.println("x 값은 " + x);
System.out.println("y 값은 " + y);
System.out.println("z 값은 " + z);
}
}