2장
자바 프로그램 기본 구조
- 클래스
객체지향언어에서 프로그램을 개발하는 단위
적어도 하나의 클래스는 있어야 함
자바의 소스파일은 클래스 이름과 연관됨(Hello 클래스 생성 -> Hello.java 소스파일 생성)
클래스 이름은 대문자로 시작하는 것이 관례
클래스 내부에는 여러개의 메소드가 포함됨 - 메서드
수행할 작업을 나열한 코드의 모임
자바 애플리케이션은 main() 메서드를 포함하는 클래스가 반드시 있어야 함
따라서 main()메서드를 포함하는 클래스가 반드시 있어야 함 - 실행문
작업을 지시하는 번수선언, 값 저장, 메서드 호출 등의 코드화면에 문자, 숫자 등을 출력하는 실행문 System.out.println("안녕");
- 주석문
행주석 //
범위 주석 /* */
문서 주석 /** */
식별자
- 규칙
- 프로그램에서 사용하는 변수, 메서드, 클래스, 상수는 이름으로 구분하는데 이것을 식별자라고 함
- 문자, 언더바(_),$로 시작해야한다. 한글도 가능하며, 영문자는 대,소문자를 구분한다.
- +,- 등 연산자를 포함하면 안된다.
- 자바 키워드를 사용하면 안된다
- 길이에 제한이 없다.
- 자바 키워드
- 데이터타입 : byte , char, short, int, long, float, double, boolean
- 접근 지정자 : private, public, protected
- 제어문 : if, else, for, while, do, break, continue, switch, case,
- 클래스와 객체 : class, interface, enum, extends, implements, new, this, super, instanceof, null
- 예외처리 : try, catch, finally, throw, throws
- 기타 : abstract, assert, const, default, false, final, import, native, package, return, static, strictfp, synchronized, transient, true, void, volatile
- 관례
- 변수와 메서드는 모두 소문자로 표기, 단 복합단어일 경우, 두번째 단어부터 단어의 첫 자만 대문자로 표기. (int a, int year, int thisYear, isEmpty)
- 클래스와 인터페이스는 첫 자만 대문자로 표기하고 나머지는 소문자로 표기, 단 복합단어일 경우, 두 번째 단어부터 단어의 첫 자만 대문자로 표기( HelloDemo, MyRunnable)
- 상수는 전체를 대문자로 표기, 단 복합단어일 때는 단어를 언더바(_)로 연결 ( NUMBER_ONE, PI)
변수
- 의미
- 프로그램은 기억공간에 데이터를 보관하고, 각 기억공간을 변수 Variable로 구분
- 변수는 데이터를 담는 상자와 같은 것으로, 종류가 다양한데, 이를 구분하려고 데이터 타입을 사용
- 데이터 타입에 따라 처리가 가능한 값, 수행할 수 있는 명령, 데이터의미, 저장하는 방식이 달라짐.
데이터타입
- 의미
- 값과 값을 다룰 수 있는 연산의 집합을 의미
- 종류
- 기억공간 크기 및 기본 값
변수
- 리터럴
- 프로그램 내부에서 값을 정의해 변수를 초기화하는데, 그 값을 리터럴 이라고 함
- 정수
int fifteen = 15; // 10진수
byte fifteen = 0b1111; // 2진수 15
short fifteen = 017; // 8진수 15
int fifteen = 0xF; // 16진수 15
long lightSpeed = 300000L; // L으로 long타입임을 명시해줘야함
- 실수
double half = 0.5; // 일반 표기법
double half = 5E-1; // 지수 표기법으로 5 * 10^-1 를 의미
float pi = 3.14195; // 오류임!!!!!!!!
float pi = 3.14195F; // F는 float타입임을 명시
double pi = 3.14195;
- 문자
char c = 'A'; // 문자
char c = 65; // 일종의 정수타입이기 때문에, 65 대입가능
char c = '\u0041'; // 유니코드 값으로 대입
char c = "A"; // "A"는 문자가 아니라 문자열이므로 오류가 남
- 변수
package chap02;
public class CharBoolDemo {
public static void main(String[] args) {
char ga1 = '가';
char ga2 = '\uac00';
boolean cham = true;
boolean geojit = false;
System.out.println(ga1);
System.out.println((int) ga1);
System.out.println(++ga1); // 각
System.out.println(ga1++); // 각 전위연산
System.out.println(ga1); // 갂
System.out.println(ga2); // 가
System.out.println(++ga2); // 각
System.out.println(cham + "가 아니면" + geojit + "입니다."); // True가 아니면 False 입니다.
}
}
여기서 또 전위 후위 연산자가 나온다.
n++ : n을 쓰고 , +1 연산을 하란 의미
++n : +1을 하고, n을 쓰라는 의미
- 변수 사용
int weight; // 정수타입의 weight 변수 선언
double x, y, z; // 3개의 변수를 ,로 연결해 선언
weight = 100; // weight변수를 100으로 초기화
x = 1.1; // x 변수를 1.1 로 초기화
- var 예약어
- 자바 10부터 지원
- 초깃값을 통하여 데이터타입 추론가능
- 키워드가 아니어서 식별자로 사용가능
package chap02;
public class VarDemo {
public static void main(String[] args) {
int var = 1; // 키워드로 쓰이는 var도 가능
// var x = 1;
// var x = 1, y = 2, z = 3 // 한번에 여러개의 변수를 추론할 수 없음
var x = 1;
var y = 3;
var z = 4; // 한번에 하나씩 추론하고, x y z 는 int type
var a = 1.1; // double타입
// var str = null; // null은 추론할 수 없음
int b = 1, c = 2, d = 2; // 타입을 명시하면 한번에 여러개 선언과 초기화 가능
// var oops; // 초기화랑 같이 안하면 못씀
// oops= 1;
}
}
- 상수
- 프로그램 실행 중 변경할 수 없는 데이터를 담는 변수
- 예를들어 원주율 값이나 빛의 속도 등
- 상수 이름은 변수와 구분하려고 모두 대문자로 표기
- 반드시 final 키워드로 지정
// 별도 선언 및 초기화
final double PI;
PI = 3.14195;
//동시에 선언 및 초기화
final double PI = 3.14195;
- 타입 변환
package chap02;
public class TypeCasting {
public static void main(String\[\] args) {
// 자동 타입변환
double d1 = 5 \* 3.14; // 15.70000000001 int인 1이 타입캐스팅됨
double d2 = 1; // 1.0 int인 1이 타입캐스팅됨
System.out.println(d1);
System.out.println(d2);
// 강제 타입변환
// double 의 3.14를 float로 형변환해 f에 3.14F 저장
float f = (float)3.14;
// int의 300을 byte로 형 변환하면 데이터 손실 발생
byte b = (byte) 600; // byte는 -128~ 127까지 표현이라 데이터가 손실됨
// double 의 3.14를 byte로 형변환하면 데이터가 손실되고 3만 저장
byte x = (byte) 3.14;
// float의 3.14를 double 로 형 변환하면 데이터 손실 없이 저장
double d = (double)3.14f;
}
}
타입변환 연습
package chap02;
public class CastDemo {
public static void main(String\[\] args) {
int i;
double d;
byte b;
i = 7 / 4; // 1 int 7 나누기 int 4는 int 1
System.out.println(i);
d = 7 / 4; // 1.0 int 7 나누기 int 4는 int 1
System.out.println(d);
d = 7 / (double) 4; // int 7(자동캐스팅으로 7.0됨) 나누기 double 4.0은 double 1.75)
System.out.println(d);
// i = 7 / (double) 4; // 결과는 double 1.75인데 얘는 int 타입 변수에 저장할 수 없음
i = 300;
if (i < Byte.MIN_VALUE || i > Byte.MAX_VALUE)
System.out.println("byte 타입으로 변환할 수 없습니다.");
else
b = (byte) i;
}
}
기본 입출력
- 화면에 데이터 출력
- println() : 내용을 출력한 뒤, 행을 바꿈
- print() : 내용을 출력만 하고 행은 안 바꿈
- printf() : 포맷을 지정해서 출력한다.
- printf() 형식
System.out.printf("포맷 명시자", 데이터, 데이터, ...);
int x = 5;
double pi = 3.14;
System.out.printf("x = %d and pi = %f\\n", x, pi);
- printf()의 포맷과 실행결과
키보드로 데이터 입력
- 프로그램으 첫 행에 다음을 추가해 Scanner 클래스의 경로이름을 컴파일러에게 알린다.
inport java.util.Scanner;
- 키보드로 데이터를 입력 받기 위해 System.in 객체와 연결된 Scanner 객체를 생성한다.
Scanner in = new Scanner(System.in);
Scanner 클래스가 제공하는 다양한 메서드를 이용해 키보드로 데이터를 입력 받는다.
int x = in.nextInt(); // 정수를 읽어 변수 x에 대입한다.
- Scanner 클래스가 제공하는 데이터 입력 메서드
연산자
- 산술연산자 사용시 주의할 점
- 피연산자의 데이터타입에 따라 결과값이 다른데 , 연산할 두 피연산자의 데이터타입이 다르면 큰 범위의 타입으로 일치시킨 후 연산 수행
- 논라 타입을 제외한 기초 타입을 피 연산자로 사용, 문자열과 덧셈을 하는 데이터는 먼저 문자열로 변환 한 후 서로 연결
비트, 시프트 연산자
- 비트연산자와 시프트 얀산자는 정수타입에만 사용
- 비트 단위로 연산을 수행
- 비트 연산자의 종류
- & : 두 비트가 모두 1일때만 1이며 나머지는 0
- | : 두 비트가 모두 0일때만 0이며 나머지는 1
- ^ : 두 비트가 서로 다를 때는 1, 동일할 때는 0
- ~ : 1을 0으로 0을 1로 바꾼다.
- 시프트 연산자 종류
- << : a의 모든 비트를 왼쪽으로 b비트만큼 이동하며, 이동할 때 마다 최하위 비트를 0으로 채운다. 곱셈효과가 나타나기때문에 산술적 왼쪽 시프트라고 한다.
- >> : a의 모든 비트를 오른쪽으로 b비트만큼 이동하며, 이동할 때 마다 최상위 비트와 동일한 비트로 채운다(1이면 1로 채움) 나눗셈 효과가 나타나기 때문에 산술적 오른쪽 시프트라고한다.
- >>> : a의 모든 비트를 오른쪽으로 b비트만큼 이동하며, 이동할 때 마다 최상위 비트를 0으로 채운다. 산술적 효과가 없기때문에, 논리적 오른쪽 비트라고 한다.
대입연산자
- 대입연산자는 오른쪽에 있는 연산식의 결과 값을 왼쪽에 있는 변수에 대입
- 예
int weight = 50; weight = weight + 10;
복합 대입 연산자 연습
package chap02;
public class AssignmnetDemo {
public static void main(String[] args) {
int value = 1;
value += 1;
System.out.println("값 : " + value);
value -= 1;
System.out.println("값 : " + value);
value <<= 3;
System.out.println("값 : " + value);
value /= 8;
System.out.println("값 : " + value);
}
}
연습문제 2-7
package chap02;
import java.util.Scanner;
public class Practice2_7 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.print("0~999 사이의 숫자를 입력하세요 : ");
int i = in.nextInt();
if (i > 999 || i < 0)
System.out.println("잘못된 입력입니다.");
else {
int a, b, c, d;
a = i / 100;
b = (i - a * 100) / 10;
c = i % 10;
d = a + b + c;
// 입력이 194 라면
System.out.println("각자리 수의 합 : " + a + b + c); // 실행결과 194 : 왜냐 a b c를 각각 받았기 때문!!!
System.out.printf("각자리 수의 합 : %d \n", a + b + c); // 실행결과 : 14
System.out.println("각자리 수의 합 : " + d); // 실행결과 : 14
}
}
}
증감 연산자
그렇다. 올게 왔다. 내가 그토록 헷갈리던 증감연산자
++ : 1을 더함
-- : 1을 뺌
++x : 연산 전 x값 1증가
x++ : 연산 하고 x값 1증가
--x : 연산 전 x 값 1 감소
x-- : 연산 하고 x값 1 감소
package chap02;
public class SignIncrementDemo {
public static void main(String[] args) {
int plusOne = 1;
int minusOne = -plusOne;
System.out.println("plusOne은 " + plusOne + "입니다.");
System.out.println("minusOne은 " + minusOne + "입니다.");
int x = 1, y = 1;
System.out.println("x = " + x + ", ++x = " + ++x); // x = 1 , ++x = 2
System.out.println("y = " + y + ", y++ = " + y++); // y = 1 , y++ = 1
System.out.println("x = " + x + ", y =" + y); // x = 2. y = 2
}
}
조건 연산자
- 조건 연산자는 조건식이 true면 연산식1 의 값이 되고, false면 연산식 2의 값이 된다.
조건식 ? 연산식1 : 연산식2
로 구성
package chap02;
public class TernaryOperatorDemo {
public static void main(String[] args) {
int x = 1;
int y;
y = (x == 1) ? 10 : 20; // True이니 연산식 1 실행
System.out.println(y); // 실행결과 : 10
y = (x > 1) ? x++ : x + 20; // False이니 연산식 2 실행
System.out.println(x); // 실행결과 : 1
System.out.println(y); // 실행결과 : 21
}
}
실습문제 2-8
package chap02;
import java.util.Scanner;
public class Practice2_8 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int a, b, c;
System.out.print("전공 이수 학점 : ");
a = in.nextInt();
System.out.print("교양 이수 학점 : ");
b = in.nextInt();
System.out.print("일반 이수 학점 : ");
c = in.nextInt();
if ((a >= 70) && (b >= 30 && c >= 30) || (b + c >= 80))
System.out.println("졸업 가능");
else
System.out.println("졸업 불가");
}
}
연산 순위다. 하다보면 자연스럽게 익혀지겠지만.
연산 순서 연습
package chap02;
public class OperatorPrecedenceDemo {
public static void main(String[] args) {
int x = 5;
int y = 10;
int z = ++x * y--;
System.out.printf("%d\t%d\t%d\n", x, y, z); // 실행결과 : 6 10 60
System.out.printf("%d\t%d\t%d\n", x, y, z); // 실행결과 : 6 10 60
int year = 2020;
System.out.println(year % 4 == 0 && year % 100 != 0 || year % 400 == 0);
// 연산 순서 : % 하고나서 연산 끝나면 ==와 != 로 논리따짐 그러고 && 먼저 하고 || 나중에 함
}
}
'TIL > [객체지향 프로그래밍] TIL' 카테고리의 다른 글
TIL (22.04.17) 시험범위 정리 3장 (0) | 2022.04.17 |
---|---|
TIL (22.04.14) (0) | 2022.04.17 |
TIL (22.04.16) 시험 범위 정리 1장 (0) | 2022.04.16 |
TIL (22.04.13) (0) | 2022.04.13 |
TIL (22.04.08) (0) | 2022.04.08 |