[자동 형변환(묵시적)]
-> 작은 범위에서 큰 범위로 변환
1. 변수는 꼭 필요한 범위로 한정하는 것이 좋다. 메모리를 효율적으로 사용하고 더 유지보수하기 좋은 코드를 만들 수 있다.
2. 좋은 프로그램은 무한한 자유가 있는 프로그램이 아니라 적절한 제약이 있는 프로그램이다.
큰 범위-> 작은범위 넣을떄 문제점: 1. 소수점 버림 2. 오버플로우
[명시적 형변환-> 캐스팅]
package Operator;
public class Operator1 {
public static void main(String[] args) {
double doubleValue=1.5;
int intValue=0;
//intValue = doubleValue; //오류 발생
intValue=(int)doubleValue;// 소수 날라가도 되니까 숫자 보고 싶으면?
// -> 명시적 형변환(캐스팅)
System.out.println(intValue);
}
}
데이터 타입 강제로 변환
public static void main(String[] args) {
int z=(int)10.5;
System.out.println(z); //10
}
public class Operator1 {
public static void main(String[] args) {
int div1=3/2;
System.out.println("div1 = " + div1); //1
double div2=3/2;
System.out.println("div2 = " + div2); //1
double div3=3.0/2; //3.0/(double)2.0 이런 식으로 큰 범위로 변경됨
System.out.println("div3 = " + div3); //1.5
double div4=(double)3/2;
System.out.println("div4 = " + div4); //1.5
}
}
자바 계산 특징
1. 같은 타입끼리의 계산은 같은 타입의 결과를 낸다
2. 서로 다른 타입의 게산은 큰 범위로 자동 형변환이 일어난다.
[Scanner클래스]
사용자 입력 받기
public class Scanner1 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in); // 사용자로부터 입력 받음
System.out.print("문자열을 입력하세요: ");
String str = scanner.nextLine(); // 입력을 String으로 가져온다. "scanner.nextLine()"
// 이 입력한 문자를 가져다 줘서 str에 담아준다.
System.out.println("입력한 문자열: " + str);
}
public class Scanner1 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);// 사용자로부터 입력 받음
System.out.print("문자열을 입력하세요: ");
String str = scanner.nextLine(); // 입력을 String으로 가져온다. "scanner.nextLine()"
// 이 입력한 문자를 가져다 줘서 str에 담아준다.
System.out.print("입력한 문자열: " + str);
System.out.println("정수를 입력하세요 : ");
int intValue = scanner.nextInt();
System.out.println("입력한 정수: " + intValue);
}
scanner.nextLine() : 엔터(\n)를 입력할떄까지 문자를 가져온다.
scanner.nextInt() : 입력을 int형으로가져온다. 정수 입력에 사용한다.
scanner.nextDouble() : 입력을 double형으로 가져온다. 실수 입력에 사용한다.
[scanner기본 사용법]
두 숫자 입력받고 합산
public class Scanner1 {
public static void main(String[] args) {
Scanner scanner =new Scanner(System.in);
System.out.print("첫 번쨰 숫자를 입력하세요:");
int num1=scanner.nextInt();
System.out.print("두 번쨰 숫자를 입력하세요:");
int num2=scanner.nextInt();
int sum=num1+num2;
System.out.println("두 숫자의 합: " + sum);
}
두 숫자 중 더 큰 수 찾기
package Scanner;
import java.util.Scanner;
public class Scanner1 {
public static void main(String[] args) {
Scanner scanner =new Scanner(System.in);
System.out.print("첫 번쨰 숫자를 입력하세요:");
int num1=scanner.nextInt();
System.out.print("두 번쨰 숫자를 입력하세요:");
int num2=scanner.nextInt();
if (num1>num2){
System.out.println("더 큰 숫자: " + num1);
}else if(num2>num1){
System.out.println("더 큰 숫자: " + num2);
}else{
System.out.println("두 숫자는 같습니다.");
}
}
}
[Scanner와 반복문 사용]
문제1) 사용자가 입력한 문자열을 그대로 출력하는 프로그램 만들기
public class Scanner1 {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
while(true){
System.out.print("문자열을 입력하세요: ");
String str=scanner.nextLine();
System.out.println(str);
if(str.equals("exit")) break;
}
}
}
문자열은 == 사용x .equals() 사용해야 한다.
문제2)
1. 첫 번째 숫자와 두 번째 숫자를 더해서 출력하는 프로그램을 개발
2. 첫 번쨰 숫자와 두 번쨰 숫자 모두 0을 입력하면 프로그램을 종료
3. 프로그램은 반복해서 실행
package Scanner;
import java.util.Scanner;
public class Scanner1 {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int num1, num2, sum=0;
while(true){
System.out.print("첫 번째 숫자를 입력하세요: ");
num1=scanner.nextInt();
System.out.print("두 번째 숫자를 입력하세요: ");
num2=scanner.nextInt();
sum=num1+num2;
if (num1==0 && num2==0){
break;
}else{
System.out.println(sum);
}
}
}
}
문제3)
1. 사용자 입력을 받아서 그 합계를 계산하는 프로그램을 작성
2. 사용자는 한 번에 한 개의 정수를 입력할 수 있다. 사용자가 0을 입력하면 프로그램을 종료
3. 종료될 때까지 사용자가 입력한 모든 정수의 합을 출력한다.
public class Scanner1 {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int num, sum=0;
while(true){
System.out.print("숫자를 입력하세요(0을 입력하면 종료): ");
num= scanner.nextInt();
sum+=num;
if(num==0){
System.out.println(sum);
break;
}
}
}
}
[문제와 풀이]
문제1) 입력과 나이를 입력받고 출력하기
"당신의 이름은 [이름]이고, 나이는 [나이]살 입니다."
public class Scanner1 {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
System.out.print("이름을 입력하세요 : ");
String name=scanner.nextLine();
System.out.print("나이를 입력하세요 : ");
int age=scanner.nextInt();
System.out.println("당신의 이름은" + name + "이고 나이는 " + age + "살 입니다.");
}
}
문제2) 사용자로부터 하나의 정수를 입력 받고 홀수인지 짝수인지 알아내라
public class Scanner1 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("정수를 입력하세요 :");
int num=scanner.nextInt();
if(num%2==0){
System.out.println("짝수입니다.");
}else{
System.out.println("홀수입니다");
}
}
}
문제3) 사용자로부터 하나의 정수 n을 입력받고, 입력받은 정수 n의 구구단을 출력하는 프로그램 작성
public class Scanner1 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("구구단의 수를 입력하세요 : ");
int num=scanner.nextInt();
for (int i=0; i<10; i++){
System.out.println(num+" * " + i + "=" + (num*i));
}
}
}
문제4) 변수 값 교환
a=10이 들어 있고, b=20이 들어있다. 변수 a의 값과 변수b의 값을 서로 바꾸어라
public class Scanner1 {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
System.out.print("A의 값을 입력하세요");
int a= scanner.nextInt();
System.out.print("B의 값을 입력하세요");
int b= scanner.nextInt();
int temp=a;
a=b;
b=temp;
System.out.println("A의 값은 " + a + " B의 값은 " + b);
}
}
문제5) 사이 숫자
사용자로부터 두 개의 정수를 입력받고, 두 정수 사이의 모든 정수를 입력하는 프로그램 출력
public class Scanner1 {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
System.out.print("A의 값을 입력하세요");
int a= scanner.nextInt();
System.out.print("B의 값을 입력하세요");
int b= scanner.nextInt();
int temp;
if (a>b){
temp =a;
a=b;
b=temp;
}
for(int i=a+1; i<b; i++){
System.out.print(i + ", ");
}
}
}
문제6) 이름과 나이 반복
1. 사용자로부터 이름과 나이를 반복해서 입력받고, 입력받은 이름과 나이를 출력하는 프로그램을 작성하세요.
사용자가 "종료"를 입력하면 프로그램이 종료되어야 한다.
public class Scanner1 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while(true){
System.out.print("이름을 입력하세요: ");
String name = scanner.nextLine(); // \n을 읽어버림
if(name.equals("exit")){
System.out.println("프로그램을 종료합니다.");
break;
}
System.out.print("나이를 입력하세요: ");
int age = scanner.nextInt(); // 10\n가 입력됨
scanner.nextLine(); // 이거 추가하면 \n을 가져오게 된다.
System.out.println("입력한 이름" + name + ", 나이" + age);
}
}
}
scanner.nextLine() 이거 중요함.
문제7) 상품 가격 계산
1. 사용자로부터 상품의 가격과 수량을 입력받고 총 수량을 출력하는 프로그램을 작성한다.
2. 가격과 수량을 입력받은 후에는 이들의 곱을 출력하라. 출력 형태는 "총 비용: [곱한 결과]"
3. -1을 입력하여 가격 입력을 종료한다.
public class Scanner1 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int price, quantity, sum=0;
while(true) {
System.out.print("상품 가격을 입력하세요 (-1을 입력하면 종료)");
price = scanner.nextInt();
if(price == -1){
System.out.println("입력을 종료합니다.");
break;
}
System.out.print("구매하려는 수량을 입력하세요 : ");
quantity= scanner.nextInt();
sum=price * quantity;
System.out.println("총 수량: " + sum);
}
}
}
[배열]
public class array {
public static void main(String[] args) {
int[] students; // 배열 변수 선언
students = new int[5]; // int그릇이 5개 있는 변수 공간 선언
// 변수 값 대입
students[0]=90;
students[1]=80;
students[2]=70;
students[3]=60;
students[4]=50;
System.out.println("학생1 점수: " + students[0]);
System.out.println("학생2 점수: " + students[1]);
System.out.println("학생3 점수: " + students[2]);
System.out.println("학생4 점수: " + students[3]);
System.out.println("학생5 점수: " + students[4]);
}
}
배열 초기화
숫자는 0 / boolean은 false / String은 null로 초기화 된다.
자바의 데이터 타입
1. 기본형 : int, long, double, boolean처럼 변수에 사용할 값을 직접 넣을 수 있는 데이터 타입
- 크기를 동적으로 바꾸거나 할 수 없다.
2. 참조형 : 데이터에 접근하기 위한 참조(주소)를 저장하는 데이터 타입을 참조형(객체, 클래스 변수들도 모두 참조형)
- 배열과 같은 참조형은 크기를 동적으로 할당할 수 있다. ex) Scanner를 사용해서 사용자 입력에 따라서 size변수의 값이 변하고, 생성되는 배열의 크기도 달라진다. 이런 것을 동적 메모리 할당
[배열 리펙토링]
기존 코드 기능은 유지하면서 내부 구조를 개선하여 가독성을 높이고, 유지보수를 용이하게 하는 과정
1. 중복 제거, 복잡성을 줄인다.
2. 버그를 줄이고, 프로그램 성능 향상
3. 코드의 설계를 개선하는데 도움
4. 즉, 작동하는 기능은 같은데, 코드를 개선하는 것을 리팩토링
√ 주의점
for(int i=0; i<5; i++){
System.out.println("학생" + (i+1) + "점수" + students[i]); // 괄호쳐서 숫자로 인식됨
System.out.println("학생" + i+1 + "점수" + students[i]); //이러면 01로 출력됨 (문자로 인식)
}
√ 숫자없이 length로 해서 배열 모두를 출력할 수 있음
for(int i=0; i<students.length; i++){
System.out.println("학생" + (i+1) + "점수" + students[i]); // 괄호쳐서 숫자로 인식됨
System.out.println("학생" + i+1 + "점수" + students[i]); //이러면 01로 출력됨 (문자로 인식)
}
√ 배열 선언과 초기화 동시에 수행
1. 첫 번째 방법
int[] students; // 배열 변수 선언
students = new int[]{90,80,70,60,50}; /* 배열 생성과 초기화 동시에
대신 int[] 안에 숫자 넣으면 안됨]*/
2. 두 번째 방법
int[] students= {90,80,70,60,50};
3. 이 방법은 안됨
int[] students;
students={90,80,70,60,50}; // 이렇게는 안됨
[2차원 배열]
대괄호 하나 추가하는거 말고는 앞서 본 1차원 배열과 같다.
public class array {
public static void main(String[] args) {
//2x3 2차원 배열을 만든다.
int[][] arr = {
{1, 2, 3},
{4, 5, 6}
};
for(int row=0; row<arr.length; row++){
for(int column=0; column<arr[row].length; column++){
System.out.print(arr[row][column] + " ");
}
System.out.println(); // 한 행이 끝나면 라인을 변경한다
}
}
}
루프를 돌면서 값을 삽입하기
public class array {
public static void main(String[] args) {
//2x3 2차원 배열을 만든다.
int[][] arr = new int[2][4];
int i=1;
for(int row=0; row<arr.length; row++){
for(int column=0; column<arr[row].length; column++){
arr[row][column]=i++;
}
}
for(int row=0; row<arr.length; row++){
for(int column=0; column<arr[row].length; column++){
System.out.print(arr[row][column] + " ");
}
System.out.println(); // 한 행이 끝나면 라인을 변경한다
}
}
}
[향상된 for문]
각각의 요소를 탐색한다는 의미로 for-each문이라고도 많이 부른다.
public class array {
public static void main(String[] args) {
int[] numbers={1,2,3,4,5};
for(int i=0; i<numbers.length;i++){
int number=numbers[i];
System.out.println(number);
}
for(int number : numbers){ // 향상된 for문 (iter이라고 적어도 됨)
System.out.println(number); // 요소를 하나하나 꺼냄
}
}
}
√ 향상된 for문을 사용할 수 없는 경우 -> i가 없어서 인덱스 번호가 필요할 때는 사용할 수 없다.
[문제와 풀이]
1. 코드 개선
package Array;
public class array {
public static void main(String[] args) {
int[] students={90,80,70,60,50};
int total=0;
double average;
for(int i=0; i<students.length; i++){
total+=students[i];
}
average=total/students.length;
System.out.println("점수 총합: " + total);
System.out.println("점수 평균: " + average);
}
}
1. 배열의 입력과 출력
사용자에게 5개의 정수를 입력 받아서 배열을 저장하고, 입력 순서대로 출력하자.
출력시 출력 포멧은 1,2,3,4,5와 같이 쉼표를 사용해서 구분하고 마지막에는 쉼표를 넣지 말아야 한다.
public class array {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int[] numbers=new int[5];
System.out.println("5개의 정수를 입력하세요: ");
for(int i=0; i<5;i++){
numbers[i]=scanner.nextInt();
}
System.out.println("출력");
for(int i=0; i< numbers.length; i++){
System.out.print(numbers[i]);
if(i<numbers.length-1){
System.out.print(", ");
}
}
}
}
2. 배열의 역순을 출력한다.
public class array {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int[] numbers=new int[5];
System.out.println("5개의 정수를 입력하세요: ");
for(int i=0; i<5;i++){
numbers[i]=scanner.nextInt();
}
System.out.println("출력");
for(int i=numbers.length-1; i>=0; i--){
System.out.print(numbers[i]);
if(i>0){
System.out.print(", ");
}
}
}
}
3. 입력받을 숫자의 개수를 입력받고, 합계와 평균을 구하라
public class array {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
System.out.print("입력받을 숫자의 개수를 입력하세요: ");
int receiver=scanner.nextInt();
int[] arr=new int[receiver];
int total=0;
double average;
System.out.println(receiver+"개의 정수를 입력하세요: ");
for(int i=0; i<receiver; i++){
arr[i]=scanner.nextInt();
total+=arr[i];
}
average=total/arr.length;
System.out.println("입력한 정수의 합계 : " + total);
System.out.println("입력한 정수의 평균 : " + average);
}
}
4. 가장 작은 수와 가장 큰 수 출력하기
public class array {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
System.out.print("입력받을 숫자의 개수를 입력하세요: ");
int receiver=scanner.nextInt();
int[] arr=new int[receiver];
int min, max;
System.out.println(receiver+"개의 정수를 입력하세요: ");
for(int i=0; i<receiver; i++){
arr[i]= scanner.nextInt();
}
max=min=arr[0];
for (int i : arr) {
if(min>i){
min=i;
}
if(max<i){
max=i;
}
}
System.out.println(min);
System.out.println(max);
}
}
[메서드]
public: 다른 클래스에서 호출할 수 있는 메서드, 접근 제어에서 학습
static : 객체를 생성하지 않고 호출할 수 있는 정적 메서드
int add(int a, int b)
int: 반환 타입을 정의한다.
add: 메서드 이름
* return을 만나면 해당 메서드는 종료가 된다.
<인수 vs 매개변수>
인수(인자): 넘겨주는 값
매개변수: 함수에 있는 파라미터
public class mothodReturn1 {
public static void main(String[] args) {
boolean result=odd(2);
System.out.println(result);
}
public static boolean odd(int i){
if(i%2==1){
return true;
}
}
}
홀수이면 true를 반환하라고 했는데, 짝수라서 missing return statement가 발생
public class mothodReturn1 {
public static void main(String[] args) {
boolean result=odd(2);
System.out.println(result);
}
public static boolean odd(int i){
if(i%2==1){
return true;
}else{
return false;
}
}
}
문제1.
18살 미만인 경우 : 미성년자는 출입이 불가합니다.
18살 이상인 경우: 입장하세요.
public class mothodReturn1 {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
System.out.print("나이를 입력하세요: ");
int age=scanner.nextInt();
entrance(age);
}
public static void entrance(int i){
if(i>=18){
System.out.println("입장하세요");
}else{
System.out.println("미성년자는 출입이 불가합니다.");
}
}
}
반환할 수 있지만, 굳이 반환 안하고 싶으면 안해도 된다.
자바 중요한 대원칙: 자바는 항상 변수의 값을 복사해서 대입한다.(원본에 절대 손을 대지 않는다.)
public class mothodReturn1 {
public static void main(String[] args) {
int num1=5;
System.out.println("1. changeNumber 호출 전, num1: " + num1); //5
changeNumber(num1);
System.out.println("4. changeNumber 호출 후, num1: " + num1); //5
}
public static void changeNumber(int num2){
System.out.println("2.changeNumber 변경 전, num2: " + num2); //5
num2=num2*2;
System.out.println("3. changeNumber 변경 후, num2: " + num2); //10
}
}
(참고로 뒤에서 참조형이라는 것을 학습하는데, 이때도 같다. 결국, 참조형 변수에 있는 값인 참조값을 복사하는 것이다!)
public class mothodReturn1 {
public static void main(String[] args) {
double number=1.5;
//printNumber(number); // double을 담지 못함
printNumber((int)number); //명시적 형변환을 사용해 double을 int로 변환
}
public static void printNumber(int n){
System.out.println("숫자: " +n);
}
}
public class mothodReturn1 {
public static void main(String[] args) {
int number=1;
printNumber(number);
}
public static void printNumber(double n){
System.out.println("숫자: " +n);
}
}
double형에 int는 들어갈 수 있지만, int형에는 double이 들어갈 수 없다.
[메서드 오버로딩]
이름이 같고 매개변수가 다른 매서드를 여러 개 정의하는 것을 "메서드 오버로딩"
오버로딩은 번역하면 과적인데, 과하게 건물을 담았다는 뜻 따라서 메서드를 여러 개 정의했다고 이해
[오버로딩 규칙]
1. 메서드의 이름이 같아도 메개변수 타입 및 순서가 다르면 오버로딩을 할 수 있다. 참고로 반환타입은 인정하지 않는다.
2. 밑에는 반환타입을 인정하지 않는 케이스
int add(int a, int b);
double add(int a, int b); // 반환 타입 인정 x
int add(int a, int b);
int add(int c, int d); // 매개변수 타입 같아서 인정 x
public class mothodReturn1 {
public static void main(String[] args) {
System.out.println("1: "+add(1,2));
System.out.println("1: "+add(1,2,3));
}
public static int add(int a, int b){
System.out.println("1번 호출");
return a+b;
}
public static int add(int a, int b, int c){ //매개변수 개수 달라서 인정함
System.out.println("2번 호출");
return a+b+c
}
}
public class mothodReturn1 {
public static void main(String[] args) {
myMethod(1,1.2);
myMethod(1.2,1);
}
public static void myMethod(int a, double b){
System.out.println("int a, double b");
}
public static void myMethod(double a, int b){ // 파라미터 타입 다르게 해서 오버로딩
System.out.println("int a, double b");
}
}
public class mothodReturn1 {
public static void main(String[] args) {
System.out.println("1: " + add(1,2));
System.out.println("2: " + add(1.2,1.5));
}
public static int add(int a, int b){
System.out.println("1번 호출");
return a+b;
}
public static double add(double a, double b){ //다른 매개변수 오버로딩 가능
System.out.println("2번 호출");
return a+b;
}
}
* 정리하자면 먼저 본인의 타입에 최대한 맞는 메서드를 찾아서 실행하고, 그래도 없으면 형 변환 가능한 메서드를 찾아서 실행한다.