이해를 위한 예시 코드 수정 및 오타 수정 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가지>
- switch문에서 switch문을 벗어나는데 사용
- 반복문에서 반복루프를 벗어나는데 사용
- 중첩된 반복문을 한번에 빠져나갈 때
모르는 사람들도 있어서 대표적인 것 하나만 추가 정리했다.
중첩된 반복문에서 바깥쪽 반복문까지 종료시키려면 바깥쪽 반복문에 이름(라벨)을 붙이고 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개도 작성이 되어있지 않을 경우, 자바 컴파일러가 기본 생성자를 추가해준다
기본생성자란?
: 매개변수와 내용이 없는 생성자
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️⃣ 상속
상속이란?
: 기존의 클래스를 재사용하는 방식 중의 하나
: 상속을 통해 클래스간의 계층 구조를 만들게 됨
상속의 특징
- 부모 클래스로부터 정의된 필드와 메소드를 사용 가능
- 새로운 필드와 메소드 추가 가능
- 부모 클래스에서 받은 메소드를 수정 가능
상속의 형식
-> 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) : 객체의 속성과 행위를 하나로 묶고, 실제 구현 내용 일부를 내부에 감추어 은닉하는 것
'Language & Framework & GIT > JAVA' 카테고리의 다른 글
[JAVA] this / super (0) | 2022.10.22 |
---|---|
[JAVA] 오버로딩과 오버라이딩 (0) | 2022.10.22 |
[언어공부] 코테를 위한 JAVA 뽀개기 #1 (0) | 2022.10.20 |
Java_Optional<T> isPresent(), ifPresent() 사용하기 (0) | 2022.08.21 |
[JAVA] 접근 지정자 (0) | 2022.08.11 |
댓글