본문 바로가기
Language & Framework & GIT/JAVA

[언어공부] 코테를 위한 JAVA 뽀개기 #2

by veganwithbacon 2022. 10. 22.
반응형

이해를 위한 예시 코드 수정 및 오타 수정 2022.10.22

접근제어자 추가

 

혹시나 놓친 부분이 있다면 말씀해주시면 감사하겠습니다

 

1️⃣반복문     

 ✔ for문

=>  "for(초기값; 조건문; 초기 증가값)

 

for(;;) 세미콜론 두 개를 넣으면 무한루프가 된다

for문 빠져나가기 (break) & for문 조건으로 돌아가기 (continue)

 

break문 예시 =>

더보기
public class Main{
    public static void main(String[] args){
    	int Supremo = 30; //원두 양
        int Colombia = 6; //콜롬비아 커피 판매량
        
        System.out.println("for문 실행")
        for(int i=0; i<Colombia; i++){
        
        	if(Colombia == 60){
                System.out.println("콜롬비아 재고 땡! :) ");
                break;
            }
            
            Colombia += 6;
            Supremo --;
            
          }
      }
}

continue문 예시=>

더보기
public  class Main{

	public static void main(String[] args){
    	int Supremo = 30; //원두 양
        int Colombia = 6; //콜롬비아 커피 판매량
        
        System.out.println("for문 실행")
        for(int i=0; i<Colombia; i++){
        
            if(Colombia == 60){
            	System.out.println("목표치 완료!! :) " );
                break;
            }
            
            Colombia +=6;
            Supremo--;
            
            if(Colombia == 60){
            
            	System.out.println("목표 판매량에 도달했습니다.");
                continue;
            }
            
            System.out.println("산미있는 커피는 안돼..");
         }
    }
}

 

 ✔for - each문

for(type data: iterate) {
    
}

여기서 반복되는 iterate은 객체로, for each는 객체에 크기만큼 반복 횟수를 정한다.

즉,iterate의 크기가 10이라면 무조건 10번 data에 각 값을 대입하여 반복문이 10번 돌아간다

임의로 반복 횟수를 정할 수 없다

 

for each는 while for문과 다르게 사용

예제로 바로 보여주는 게 이해 빠름

public class Main {

    public static void main(String[] args) {

        ArrayList<String> coffeeList = new ArrayList<String>();
        userList.add("브라질 산토스");
        userList.add("콜롬비아 수프리모");
        userList.add("자메이카 블루마운틴");
        userList.add("에티오피아 예가체프");
        userList.add("엘살바도르");

        for(String coffee: coffeeList) {
            System.out.println(coffee);
        }
    }
}

예시처럼 coffeeList에 산토스,수프리모,블루마운틴,예가체프,엘살바도르를 리스트에 추가해주고 for each문을 통해 coffee에 순서가 올 때마다 sout을 통해 coffee를 출력해준다.

 

sout이 궁금하다면 인텔리제이에 sout을 누르고 엔터를 쳐보자. 

 

 ✔while문

for문이 정해진 횟수만큼 반복한다면, while문은 조건식이 true인 경우 계속 반복한다.

조건식은 비교 또는 논리 연산식이 주로 오며, 조건식이 false면 반복을 멈추고 while문을 종료한다

while(조건식) {
  실행문;
}

간단 예시

더보기
while(i <= 100) {
	sum += i;
	i++;
}
System.out.printf("1~%d까지 합 : %d" , i-1 ,sum);
}

 

✔do-while문 

while문과 동일하게 반복 실행을 하나 우선 실행 후 결과에 따라 반복 실행을 결정하는 형태이다.

do {

  실행문;

} while (조건식)   // 조건식이 true인 경우 실행문을 반복, false인 경우 do-while문 종료

간단 예시

더보기
public class exampleDoWhile{
public static void main(String[] args){
	int sum=10;
    int i=1;
    
    do{
    sum+=i;
    i++;
    
    }while(sum<100);
    
    System.out.println();
    System.out.println(sum);
  }
}

 

위에서 break문에 대해 언급했지만 한 번 더 언급하겠다.

break문은 반복문인 for문, while문, do-while문 실행을 중지할 때 사용하는데, break문의 3가지 역할은 다음과 같다

 

<break문의 역할 3가지>

  1. switch문에서 switch문을 벗어나는데 사용
  2. 반복문에서 반복루프를 벗어나는데 사용
  3. 중첩된 반복문을 한번에 빠져나갈 때

 

모르는 사람들도 있어서 대표적인 것 하나만 추가 정리했다.

중첩된 반복문에서 바깥쪽 반복문까지 종료시키려면 바깥쪽 반복문에 이름(라벨)을 붙이고 break : 이름을 사용한다

public class practice {
public static void main(String[] args) {
checkCase: for (char upper = 'A'; upper <= 'Z'; upper++) {   // Otter라는 라벨 붙임
  for (char lower = 'a'; lower <= 'z'; lower++) {
    System.out.println(upper + "-" + lower);
    
    if (lower == 'g') {
        break checkCase;    // break checkCase;을 사용해 바깥쪽 반복문까지 종료
    }
  }
}
   System.out.println("프로그램 실행 종료");
  }
}

 

객체지향언어

1️⃣클래스, 인스턴스, 메소드 

 

 ✔클래스(Class)란?

=> 객체의 속성을 정의한 것

클래스는 표현하고자 하는 대상의 공통 속성을 한 군데에 정의해 놓은 것이라고 할 수 있다

 

클래스 내부의 정보를 멤버 변수라고 한다

 

양꼬치 큐브를 만드는 틀이 곧 클래스가 되며 양꼬치 틀로부터 만들어진 양꼬치 큐브가 인스턴스이다.

이해가 잘되지 않는다면 https://veganwithbacon.tistory.com/106 해당 글을 한 번 더 참고하자!

 

 ✔인스턴스(Instance)란?

 => 어떠한 클래스로부터 만들어진 객체를 그 클래스의 인스턴스

 

인스턴스의 멤버변수에 접근할 때는 [생성된 인스턴스.멤버변수]의 형식을 사용하면 됩니다.

 

 

 ✔메소드(method)란?

=> 어떠한 작업을 수행하는 코드를 하나로 묶어 놓은 것

 

   메소드가 필요한 이유

1. 재사용성

       - 메소드를 만들어 놓으면 이후 반복적으로 재사용으로 가능

         

2. 중복된 코드 제거

       - 메소드를 활용하면 중복된 부분을 없애므로 보다 효율적인 코드

 

3. 프로그램 구조화

       - 구조화에 대한 예시를 통해 이해

 

2️⃣ 생성자 

인스턴스가 생성될 때 사용되는 '인스턴스 초기화 메소드'

인스턴스 변수를 초기화하는 용도로 사용

 

💡 생성자의 형식

클래스이름 (타입 변수명, 타입 변수명, ...){
    인스턴스 생성 될 때에 수행하여할 코드
    변수의 초기화 코드
}

 

💡 생성자 조건

  1. 생성자의 이름은 클래스명과 같아야 한다.
  2. 생성자는 리턴 값이 없다.

자바 컴파일러는 클래스에 생성자가 1개도 작성이 되어있지 않을 경우, 자바 컴파일러가 기본 생성자를 추가해준다

 

기본생성자란?

 : 매개변수와 내용이 없는 생성자

 

ex) 말그대로 아무것도 없는 것을 의미(종종 내가 깜박해서 한 번 더 정리함)

public class ColombiaCoffee {

         public ColombiaCoffee(){};     //이게 기본 생성자

        public static void main(String[] args){

                    ColombiaCoffee CC = new ColombiaCoffee();

           }
}

기본 생성자를 보여주기 위해 일부로 작성을 했지만,  어떠한 생성자도 존재하지 않는다면 

자바 컴파일러가 컴파일 시 클래스에 자동으로 기본 생성자를 추가해준다는 것이다.

만약에 기본생성자 줄을 지우고 아래 ColombiaCoffee CC = new ColombiaCoffee(); 를 호출한다해도 에러가 나지 않는다는 것이다.

 

>생성자 예시

더보기
class Phone {
    String model;
    String color;
    int price;

    Phone(String model, String color, int price) {
        this.model = model;
        this.color = color;
        this.price = price;
    }
}

public class Main {
    public static void main(String[] args) {
        Phone galaxy = new Phone("Galaxy10", "Black", 100);

        Phone iphone =new Phone("iPhoneX", "Black", 200);

        System.out.println("철수는 이번에 " + galaxy.model + galaxy.color + " + 색상을 " + galaxy.price + "만원에 샀다.");
        System.out.println("영희는 이번에 " + iphone.model + iphone.color + " + 색상을 " + iphone.price + "만원에 샀다.");
    }
}

생성자에 사용되는 this는 생성된 객체 자신을 가리키며 생성자의 매개변수의 값을 객체의 해당하는 데이터에 넣어주게 됨

 

>인스턴스(멤버) 변수의 기본값

class에 선언된 변수는 instance가 생성될 때 값이 초기화(initialize)됩니다.

이 때, 변수의 선언부나 생성자를 통해서 초기화를 하지 않으면, 기본값(default value)를 가진다.

byte default: 0 // 1byte 를 구성하는 8개의 bit가 모두 0이라는 뜻.
short default: 0
int default: 0
long default: 0
float default: 0.0
double default: 0.0
reference default: null

레퍼런스 타입 변수들은 초기화 해주지 않으면 기본 할당값이 없기에 전부 null로 나온다

 

3️⃣ 상속

 

  상속이란?

: 기존의 클래스를 재사용하는 방식 중의 하나

: 상속을 통해 클래스간의 계층 구조를 만들게 됨

 

  상속의 특징

  1. 부모 클래스로부터 정의된 필드와 메소드를 사용 가능
  2. 새로운 필드와 메소드 추가 가능
  3. 부모 클래스에서 받은 메소드를 수정 가능

 

상속의 형식

-> extends를 이용해 사용가능하다

class Animal{}
class Dog extends Animal{}
class Cat extends Animal{}

Animal 는 부모 클래스, 조상 클래스

Dog, Cat 클래스는 자식 클래스 , 자손 클래스     라고 불린다.

 

 

 

오버로드?

: 한 클래스 내에서 동일한 이름의 메소드를 여러 개 갖는 것

 

상속 예시(스파르타코딩클럽 자바문법 뽀개기 복붙 코드)

더보기
class Animal {
    String name;

    public void cry() {
        System.out.println(name + " is crying.");
    }
}

class Dog extends Animal {

    Dog(String name) {
        this.name = name;
    }

    public void swim() {
        System.out.println(name + " is swimming!");
    }
}

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog("코코");
        dog.cry();
        dog.swim();
        
        Animal dog2 = dog;
        dog2.cry();
//        dog2.swim(); // compile error
    }
}

부모는 자식 타입에 있는 함수를 호출할 수 없다. 컴파일 에러가 발생함

 

 상속을 받을 때 여러 클래스를 상속받을 수는 없다. 오직 하나의 클래스만을 상속받을수 있다.

정말 혹시나 해서 말하는 거지만 extends가 상속/ implements도 상속이지만 implements는 인터페이스 상속이라 다르다.

extends=> 클래스 / implements =>인터페이스(얘는 다중상속가능함)

 

https://veganwithbacon.tistory.com/116 오버로딩과 오버라이딩에 대한 개념

 

위에 생성자를 언급할 때 this를 말할 수 있었는데 왜 이제 this,super에 대해 언급하는지 의아할 수도 있다.

상속을 통한 오버로딩,오버라이딩의 개념을 다시 한번 짚은 후, this/super에 대한 확실한 이해를 위해 후에 언급했다.

 

this()와 super()에 관해서는 https://veganwithbacon.tistory.com/117 이 링크를 참고하자

 

 

4️⃣접근제어자

접근 제어자(access modifier)

 : 접근 제어자는 멤버 변수/함수 혹은 클래스에 사용되며 외부에서의 접근을 제한하는 역할을 한다.

 

 

private : 같은 클래스 내에서만 접근이 가능

 

default(nothing) : 같은 패키지 내에서만 접근이 가능

 

protected : 같은 패키지 내에서, 그리고 다른 패키지의 자손클래스에서 접근이 가능

 

public : 접근 제한이 전혀 없다

 

 

 

👌접근 범위 정리

(좁음)                                              (넓음)

private -> default -> protected -> public

 

 

  근데 왜 쓰는데?

객체지향 프로그래밍이란 객체들 간의 상호작용을 코드로 표현하는 것인데, 이때 객체들간의 관계에 따라서 접근 할 수 있는 것과 아닌 것, 권한을 구분할 필요가 생긴다.

- 클래스 내부에 선언된 데이터의 부적절한 사용으로부터 보호하기 위해

- 사용자에게 객체를 조작 할 수 있는 수단만을 제공하여 객체의 사용에 집중하도록 돕기 위함

- 접근 제어자는 캡슐화가 가능할 수 있도록 돕는 도구

 

캡슐화(encapsulation) : 객체의 속성과 행위를 하나로 묶고, 실제 구현 내용 일부를 내부에 감추어 은닉하는 것

 

 

반응형

댓글