기록/자바_국비

[배운 내용 정리] 1106 자바 국비교육

mois 2020. 11. 6. 23:55
728x90

2020년 11월 04일 09시 ~ 15시 30분 zoom으로 진행

자바 국비지원교육 4일차


static 

 static메소드는 프로그램의 실행과 동시에 메모리의 static 영역에 할당된다.

 그래서 클래스명.메소드명(); 으로 바로 접근 가능하다

 다른 메소드는 static에 올라가 있지 않아서 stack에 올리는 과정이 필요하다

 static 메소드는 오직 static 메소드에서만 접근 가능하다

 

접근제한자

public 

 어떤 클래스에서든 접근 할 수 있다

 public 클래스는 해당 메소드가 작성된 MethodTest01 클래스 뿐만 아니라 다른 클래스에서도 바로 접근 가능하다

 

protected

같은 패키지에서는 접근 가능하고, 패키지가 다를 경우 자식 클래스일 경우에만 접근 가능하다.

 상속받은 클래스에서만 접근 가능!!

 

default

 접근 제한자를 명시하지 않을 경우 default 접근 제한자를 갖게 된다. 같은 패키지 내에서만 접근 가능

 

private

 현재 클래스에서만 접근 가능하다

 

 

종류 동일 클래스 하위 클래스 동일 패키지 외부 패키지(클래스)
private O X X X
(defalut) O X O X
protected O O O X
public O O O O

package com.test01;

 

public class MethodTest01 {

           //접근제한자 실습

           public static void main(String[] args) {

                     //nonStaticMethod

                     //1. 준비

                     MethodTest01 mt01 = new MethodTest01();

                     //2. 실행

                     mt01.nonStaticMethod();

                     //결과 => public method

                    

                     //static Method

                     //클래스명.메소드명(); 으로 바로 사용 가능

                     MethodTest01.publicMethod();

                     //결과 => public static method

                    

                     MethodTest01.publicMethod();

                     //결과 => public static method

                    

                     MethodTest01.protectedMethod();

                     //결과 => protected static method

                    

                     defaultMethod();

                     //결과 => default method

                     //이렇게 쓰는 것은 추천하지 않음, 어느 클래스에서 만들어진 메소드인지 명시해주는것이 베스트

                    

                     MethodTest01.privateMethod();

           }

          

 

           //public 어디에서나 접근 가능, 참조 가능 (+)

           public static void publicMethod() {

                     System.out.println("public static method");

           }

          

           //protected

           //상속일 경우 상속된 곳에서 접근 가능

           //상속이 아닌 경우 같은 패키지 내에서 접근 가능

           protected static void protectedMethod() {

                     System.out.println("protected static method");

           }

          

           //default

           //같은 패키지 내에서만 접근 가능

           static void defaultMethod() {

                     System.out.println("default method");

           }

          

           //private

           //현재 클래스 내에서만 접근 가능

           private static void privateMethod() {

                     System.out.println("private method");

           }

          

           //static 메소드는 오직 static메소드에서만 접근 가능하다!

           public void nonStaticMethod() {

                     System.out.println("public method");

           }

          

}

 

 

package com.test02;

 

import com.test01.MethodTest01;

 

public class MethodTest03 extends MethodTest01{

 

           public static void main(String[] args) {

                     MethodTest01.publicMethod();

                     //MethodTest01는 다른 패키지라 접근 할 수 없어서 에러가 뜸@

                     //import 해줘야 함 -> import java02_Method.MethodTest01;

                    

                    

                     //MethodTest01.defaultMethod(); //다른 클래스에서 접근 할 수 없어서 에러가 난다

                     //MethodTest01.privateMethod();

                    

                     //extends MethodTest01 를 사용하지 않으면

                     //MethodTest01.protectedMethod(); //이거 에러남

                    

                     //extends MethodTest01 를 사용 했을 경우

                     //그러니까 즉, protectedMethod를 선언한 클래스를 상속받았을 경우 호출 가능하다!

                     MethodTest01.protectedMethod();

           }
}

package com.test01;

 

public class MethodTest02 {

           //같은 패키지 안에 다른 클래스의 메소드들을 불러와서 사용해보자

           public static void main(String[] args) {

                     //같은 패키지 안의 MethodTest01의 메소드들을 불러와서 사용해보자

                    

                     //1. static method 호출하기

                     MethodTest01.publicMethod();

                     MethodTest01.protectedMethod();

                     MethodTest01.defaultMethod();//무조건 같은 패키지 안에서만!!

                     //MethodTest01.privateMethod();

                     //에러, 접근이 불가능하다고 뜸 오ㅑ? private은 같은 클래스 안에서만 접근 가능하기 때문에!

                     //결과

                     //public static method

                     //protected static method

                     //default method

                     

                     //2. non static 메소드 호출

                     //static이 아닐 경우 준비과정이 필요

                     MethodTest01 mt01 = new MethodTest01();

                     mt01.nonStaticMethod();

                     //결과

                     //public method

                    

           }

}

 

package com.test02;

 

public class MyCalMain {

          

           public static void main(String[] args) {

                     //static 메소드의 경우 Class.Method();로 사용한다

                     //매개변수에 맞춰 값을 넘겨주어야 한다

                     MyCal.sum(1, 2);

                     //MyCal.sum(1, 2.0); 은 에러

 

           }

}

package com.test02;

 

public class MyCal {

           //여기서는 기능만 구현하고 MyCalMain에서 실행할거

          

           //접근제한자 메모리 리턴타입 메소드명(매개변수)

           public static void sum(int i, int j) {

                     //두 숫자를 더하는 기능

                     int res = i + j;

                    

                     System.out.println("res = " + res);

           }

}

 

main에서 MyCal.sum();이 아니라 MyCal.sum(1, 2); 이 온 이유

 MyCal 클래스의 sum 메소드를 살펴보면 매개변수(파라미터)로 int i와 int j가 있기 때문에,

 sum메소드를 사용하려면 매개변수로 int 값 2개를 넘겨주어야 한다.

 

MyCal.sum(1, 2.0); 이 에러나는 이유

 MyCal 클래스에서는 매개변수 int 값 2개를 받는 함수만 정의를 해놨는데,

 메인에서 sum 함수를 사용하면서 정수 값 하나와 실수 값 하나를 넘겨주었기 때문

 얘는 자동 형변환을 사용 할 수 없고, MyCal 함수에 정의한 그대로 함수를 사용해주어야 한다.

 

package com.test02;

 

public class MyCalMain {

            

             public static void main(String[] args) {

                           //static 메소드의 경우 Class.Method();로 사용한다

                           //매개변수에 맞춰 값을 넘겨주어야 한다

                           MyCal.sum(1, 2);

                           //MyCal.sum(1, 2.0); 은 에러

                          

                          

                           //MyCal.sub(10,3);//아무것도 뜨지 않는다. 왜? 값을 출력하는 구문을 사용하지 않았기 때문

                           int sub = MyCal.sub(10, 3);

                           System.out.println("sub = " + sub);

                           System.out.println("MyCal.sub(10, 3) = " + MyCal.sub(10, 3));

                          

                           double mul = MyCal.mul(10.0, 3.0);

                           double mul2 = MyCal.mul(10, 3);

                           System.out.println("mul = " + mul + "\t mul2 = " + mul2);

                           System.out.println("MyCal.mul(10.0, 3.0) = " + MyCal.mul(10.0, 3.0));

                           System.out.println("MyCal.mul(10.0, 3.0) = " + MyCal.mul(10.0, 3.0));

                           //둘이 결과가 왜 같을까 -> 매개변수로 int 값을 넣어도 double형으로 자동으로 형변환이 됐음!!

                          

                           MyCal.div(10, 3);

                          

             }

}

package com.test02;

 

public class MyCal {

             //여기서는 기능만 구현하고 MyCalMain에서 실행할거

            

             //접근제한자 메모리 리턴타입 메소드명(매개변수)

             //이 함수는 결과 값을 반환하지 않는다 return없음

             public static void sum(int i, int j) {

                           //두 숫자를 더하는 기능

                           int res = i + j;

                          

                           System.out.println("res = " + res);

             }

            

             //리턴타입이 void 대신 int 인 함수 작성

             //이 함수는 결과 값으로 int형 데이터를 반환한다.

             //리턴타입이 void가 아닐 경우 함수 내부에 return 이 꼭 있어야 한다

             public static int sub(int i, int j) {

                           int res = i-j;

                          

                           return res;

             }

            

             public static double mul(double d1, double d2) {

                           double res = d1 * d2;

                          

                           return res;

             }

            

             public static void div(int d1, int d2) {

                           // '/' : 나눈 후의 몫

                           // '%' : 나눈 후의 나머지

                          

                           int div01 = d1 / d2;

                           double div02 = d1 % d2;

                           //%d는 정수를 의미

                           System.out.printf("%d / %d 의 몫 : %d \n", d1, d2, div01);

                           System.out.println(d1 + " / " + d2 + " 의 나머지 : " + div02);

                          

                           System.out.println("div01(/) = " + div01 + "\tdiv02(%) = " + div02);

             }

            

}

 

연산자

 

단항연산자

 증감 연산자 : ++ , --

 피연산자의 값에 1을 더하거나 빼는 연산자,  위치에 따라 결과 값이 다르게 나타남

-      전위 연산 (++num) : 먼저 연산 후 다른 연산 실행

ex)

   int a = 10;

   int b = ++a;//연산 후 대입 ->  a값을 1 증가 시키고 그 값을 b에 대입한다.

   System.out.println(a + “ , ” + b);//결과 -> 10 , 11

-      후위 연산 (--num)  : 다른 연산 우선 실행 후 연산

 ex)

   int a = 10;

   int b = a++;//대입 후 연산 ->  a값을 대입하고, a값을 1 증가 시킨다.

   System.out.println(a + “ , ” + b);//결과 -> 10 , 11

 

논리 부정 연산자 : !

 논리 값을 부정하여 반대 값으로 변경한다, 제어문을 활용할 때 많이 쓰임

ex)

   boolean bool1 = true;

   boolean bool2 = !bool1; //bool2 는 false

 

산술 연산자

 일반 수학과 동일한 연산 방법, 우선 순위. %는 나머지 값을 구하는 연산

 ->  + ,  -  ,  *  ,  /  ,  %

 

비교 연산자

 데이터가 같은지, 다른지 비교할 때 쓰임, 항상 논리값(true, false)이 결과 값이다

 모든 자료형에 사용 가능하다

 a == b : a와 b가 같으면 true 반환  a != b : a와 b가 다르면 true 반환

 두 연산자의 값의 크기 비교

 기본형 boolean 과 참조형을 제외하고 나머지 자료형에 사용 가능

 a < b : a가 b보다 작으면 true

 

논리 연산자

 논리 값 두 개를 비교하는 연산자

 && : 두 피연산자가 모두 true일 때 true를 반환한다 (AND 연산자)

 ||   : 두 피연산자 중 하나만 true여도 true 반환한다 (OR 연산자)

 (a>b) && (c<a) => true 이려면 a>b == true / c<a == true 이어야 한다

 

복합 대입연산자

 다른 연산자와 대입 연산자가 결합한 것으로, 자기 자신과 연산 후 연산 결과를 자기 자신에게 누적 대입

     a += 10    ->    a = a + 10

     a -= 10    ->    a = a - 10

     a *= 10    ->    a = a * 10

     a /= 10    ->    a = a / 10

     a %= 10    ->    a = a % 10

 

삼항 연산자

 조건식 ? 식1 : 식2

 조건식의 결과 값에 따라 연산을 처리하는 방식으로 결과값이 참일 경우 식1을 수행

 거짓일 경우 식2 수행한다.

 삼항 연산자 안에 삼항 연산자를 중첩하여 쓰는 것도 가능!

 ex)

    int result1 = a > b ? a++ : b--;

    int result2 = a < b ? a++ : (b == 0 ? a-- : b++);

 

 

package com.test01;

 

import java.util.Scanner;

 

public class Operator01 {

 

             public static void main(String[] args) {

                           //Operator01.testMethod();

                          

                           Operator01 o = new Operator01();

                           //o.test1();

                           //non-static 이라 객체 생성해주는 작업 필요

                          

                           o.test2();

             }

            

             public static void testMethod() {

                           //!논리값 : 논리값을 반대로 바꾸는 연산자

                           System.out.println("true의 부정 : " + !true);

                           System.out.println("false의부정 : " + !false);

                          

                           Scanner sc = new Scanner(System.in);

                          

                           System.out.println("정수 하나 입력 >> ");

                           int num = sc.nextInt();

                          

                           System.out.println("입력한 정수가 짝수인가 ? " + (num%2==0));

                           System.out.println("입력한 정수가 짝수인가 ? " + (num%2!=0));

             }

            

             public void test1() {

                           //증감 연산자

                           //++ : 1 증가 , data++ 후위 연산자 , ++data 전위 연산자

                           //-- : 1감소 , data--         , --data

                          

                           int age = 20;

                           System.out.println("현재 나이는? " + age);

 

                           ++age;

                           System.out.println("age? " + age);

                          

                           age++;

                           System.out.println("age? " + age);

                          

                           --age;

                           System.out.println("age? " + age);

                          

                           age--;

                           System.out.println("age? " + age);

                          

             }

            

            

             public void test2() {

                           //후위연산자

                           //다른 연산처리 후 증감

                           int num1 = 20;

                           int result = num1++ * 3;

                           System.out.println("result = " + result);//60

                           System.out.println("num1 = " + num1); //21

 

                          

                           //전위연산자

                           //증감 후 다른 연산 처리

                           int num2 = 20;

                           int result2 = ++num2 * 3;

                           System.out.println("result2 = " + result2);//63

                           System.out.println("num2 = " + num2); //21     

             }

}

 

package com.test01;

 

public class Operator02 {

             public static void main(String[] args) {

                           /*

                           Operator02 o = new Operator02();

                           o.opTest();

                           //위와 같은 코드

                           new Operator02().opTest();

                           */

                           new Operator02().opTest2();

             }

            

             public void opTest() {

                           int num1 = 10, num2 = 3;

                          

                           System.out.println("num1 + num2 = " + (num1 + num2));//13

                           System.out.println("num1 - num2 = " + (num1 - num2));//7

                           System.out.println("num1 * num2 = " + (num1 * num2));//30

                           System.out.println("num1 / num2 = " + (num1 / num2));//3

                           System.out.println("num1 % num2 = " + (num1 % num2));//1

             }

            

            

             public void opTest2() {

                           //비교 연산자 ( >, <, ==, !=, >= , <= )

                          

                           int num1 = 10, num2 = 20;

                           System.out.println( "num1이 num2와 같은가 " + (num1 == num2) );       //false

                           System.out.println( "num1이 num2와 같지 않은가" + (num1 != num2) );    //true

                           System.out.println( "num1이 num2보다 작거나 같은가 " + (num1 <= num2) ); //true

                           System.out.println( "num1이 num2보다 크거나 같은가 " + (num1 >= num2) ); //false

                           System.out.println( "num1이 num2보다 큰가 " + (num1 > num2) );        //false

                           System.out.println( "num1이 num2보다 작은가 " + (num1 < num2) );       //true

             }

 

}