본문 바로가기
5.1 대외활동/Likelion(12기 세션자료)

[Eulji_LikeLion_2024_BackEnd] 1차-(2) JAVA 심화

by Dohi._. 2024. 3. 2.
728x90

1차-(2) 목차  

  1-3 Java 심화

    1) 반복문

    2) 예외처리

    3) 배열

    4) 객체와 클래스 (1)

    5) 함수

    6) 객체와 클래스 (2)

    7) 접근제어

 

 

1-3 Java 심화 

1) 반복문

 

반복문

Java는 반복 연산을 프로그래밍 할 수 있도록 3종류의 반복문을 제공한다.

for문, while문, do-while문

 

for문

 

 

for문은 초기문 → 조건식  → (참인경우)  → 작업문 → 반복후 작업  →  조건식  → (참인경우)  →...

초기문: 주로 지역 변수를 선언하고 바로사용한다. 초기문에서 선언한 변수는 for문내에서만 사용가능

조건식: 조건이 true일 때 반복이 계속되고 false일 경우 for문을 벗어난다.

반복후 작업: 한번 반복이 될때마다 실행되는 코드로  ,를 이용하여 여러문장을 실행 할 수 있다.

for문실행해보기

for(int i=0; i<10;i++){
	System.out.print("["+i+"]");
    }
   //출력결과 [0][1][2][3][4][5][6][7][8][9]

 

while문/ do-while문

//while문
while(조건식){
작업문
}

//do-while문
do{
작업문
}
while(조건식);

 

둘다 조건식이 true일때 작업문이 반복 실행되는 것은 동일하나

do-while문은 작업문 최초1회 실행후 반복조건을 따집니다

 

continue와 break

둘은 반복문과 함께 사용되며 반복의 흐름을 조율하는 중요한 기능을 합니다.

continue문: 반복문을 빠져나가지 않고 다음 반복으로 넘어감.

(for문의경우 반복후작업 while계열은 조건식으로 넘어가서 다음 반복문으로 넘어간다.)

break문: 문장(조건문, 반복문)을 빠져나감

 

실습

for문을 이용하여 구구단의 2단 3단 5단만 출력하시오.

public class ftest{
	public static void main(String[] args){
    //System.out.print()
    //System.out.println() //출력이 끝나면 다음줄로 커서이동(줄이동)
   	//실습코드
    
    
    
    
    //
    }
}

 

출력결과

2단 2 4 6 8 10 12 14 16 18 
3단 3 6 9 12 15 18 21 24 27
5단 5 10 15 20 25 30 35 40 45

 

2) 예외처리

코드를 작성하다보면 문제가 발생한 부분에 대해 대응이 필요할 경우가 있다.

자바에서는 문제가 발생시 오류메세지로 예외의 종류를 알려준다.

흔히 에러라고 많이하지만 에러와 예외는 차이점이 있다.

  • 에러 (Error)
    • 개발자가 해결이 불가능한 문제
    • 하드웨어의 오류 혹은 고장으로 인한 문제 발생
    • 에러가 발생시 프로그램 종료후, 그후 정상적인 상태로 실행 불가능
  • 예외 (Exception)
    • 개발자가 해결가능한 문제
    • 사용자의 잘못된 조작, 개발자의 실수로 인한 문제 발생
    • 예외가 발생시 프로그램 종료, 단 예외 처리를 통해 정상적인 상태로 실행 가능

try-catch-finally문

예외 상황을 미리 조치를 취할 수 있게 해준다.

try{
	예외가 발생할 가능성이 있는 문장; 
}
catch(처리할 예외타입선언){
	예외처리문;
 }
 finally{
  예외 발생 여부와 상관없이 필수적으로 실행할 코드 //생략가능
 }
 //예시코드
 
try{
	a = 1+2;
}
catch(Exception e){//객체 e에 예외 정보가 넘어옴
	System.out.print("예외발생");
 }

catch는 여러개를 작성할 수 있으며

예외 타입과 일치하지 않는 catch가 없다면 프로그램은 종료된다.

 

자바의 대표적인 예외 클래스는 이와 같다.

예외 타입 예외 발생 경우
Exception 모든 예외의 부모
ArithmeticException 정수를 0으로 나눌 때 발생
NullPointerException null 레퍼런스를 참조할 때 발생
ClassCastException 변환 못하는 타입으로 객체를 변환할 경우 발생
IllegalArgumentException 잘못된 인자 전달 시 발생
IOException 입출력 동작 실패 또는 입터럽트 시 발생
OutOfMemoryError 메모리가 부족한 경우 발생
ArratIndexOutOfBounsException 배열의 범위를 벗어난 접근 시 발생

 

throw, throws

throw 개발자가 의도적으로 예외를 발생시키는 것

throw는 주로 로직을 구현하고 실행 중 문제가 없어도 해당 로직이 개발자가 의도한 대로 통과하지 않을 경우

고의로 예외를 발생시켜야 할 경우에 사용됩니다.

 

예시코드

try{
	throw new Exception(); //강제 Exception 객체 생성하여 Exception 예외발생
	} catch(Exception e){
 	System.out.print("Throw..")   
}

 throws: 해당 메서드 내에서 예외처리를 하지 않고

해당 메서드를 사용한 곳에서 예외 처리를 하도록 예외를 던지는 것(책임 전가 하는 것)

 

실전 예시코드 (실행)

class Main {
	public static void main(String[] args) {
		int a = 123;
		int b = 0;
		try {
			나누기(a,b);
		} catch (ArithmeticException e) {
			e.printStackTrace();//예외 내용 출력 
		}

	}
	public static int 나누기(int a, int b) throws ArithmeticException {
		if (b == 0) throw new ArithmeticException("0으로 누가 나눌수 있겠니..");
        //예외 생성 + 예외 내용추가
		return a / b;
	}
}
//실행결과
//java.lang.ArithmeticException: 0으로 누가 나눌수 있겠니..
//	at Main.나누기(Main.java:20)
//	at Main.main(Main.java:11)
//
//[Execution complete with exit code 0]

 

 

3) 배열

 

배열(array)

같은 타입의 여러 변수를 하나의 묶음으로 다루는 것

배열을 선언하기위해서는 타입 또는 변수이름 뒤에 []를 붙여 배열을 선언한다.

//선언 방법
int[] score;
int age[];

배열은 선언한다고 해서 저장할 공간이 생성되는 것이 아니기에 공간 생성을 해줘야한다.

int[] score;
score = new int[5];
// 한번에 가능하다.
int[] age = new int[5];
// 선언과 동시에 초기화도 가능하다.
String[] name = {"CKT","Choi","Dohi"};
int[] test = new int[]{100, 80, 10};

//초기화경우 주로 실수하는 경우
int[] test1;
test1 = new int[]{100, 80, 10}; //ok

int[] test2;
test2 ={100, 80, 10}; //error

 

배열에서는 같은 타입의 여러 변수를 담을 수 있다 했는데 

배열에 배열을 넣는 경우도 있다 

이를 다차원 배열 이라한다.

int[][] score={ {10,20,10},{21,12,50} };

ArrayList

기존의 배열은 항상 배열의 길이를 정하고 시작합니다. 이는 추후에 배열의 이용을 힘들고 복잡하게 하는 요소중 하나가 됩니다.

그래서 자바에서 객체 배열을 좀 더 쉽게 이용하게 하기 위해서 여러가지 제공되는 클래스가 있지만 

대표적으로 ArrayList를 간단하게 소개하고자 합니다.

 

선언방법

ArrayList<E> 배열 이름 = new ArrayList<E>(); //<E>를 제네릭이라고 합니다.

주요 메소드

메서드( 반환 자료형 메소드이름) 설명
boolean add(E e) 하나의 요소를 배열에 추가 (E e)는 요소의 자료형
int size 배열에 있는 요소의 전체 개수를 반환
E get(int index) 배열의 index 위치에 있는 요소 반환
E remove(int index) 배열의 index 위치에 있는 요소 제거후 반환
boolean isEmpty() 배열이 비어있는지 확인

 

사용 예시를 보고 간단하게 마무리 짓도록 하겠습니다.

import java.util.ArrayList; 

public class likelionArray{
	public static void main(String[] args){
    	ArrayList<Member> euljiLion = new ArratList<Member>();
        
        euljiLion.add(new Member("아무개","백엔드"));
        euljiLion.add(new Member("배고파","프론트엔드"));
        euljiLion.add(new Member("도히","기획디자인"));
        
        for(int i=0; i<euljiLion.size(); i++){
        Member member = euljiLion.get(i);
        member.showname(); //아래에서 배울 예정!
        }
      }
    }

 


 

4) 객체와 클래스(1)

위에서 ArrayList를 배워봤는데 Member..? 이건 뭐지 하신 학우분들도 있으실텐데요.

빠르게 클래스에 대해서 알게 되시고 위의 코드를 보시면 아하 이렇구나 하시게 될겁니다.

 

객체

흔히 자바를 객체 지향 프로그래밍(object-Oriented Programming :OOP)이라고 합니다.

우선 객체를 국어사전에 검색해볼까요?

  • 의사나 행위가 미치는 대상.
  • 문장 내에서 동사의 행위가 미치는 대상.

즉 객체는 자산만의 고유한 특성(state)과 행동(behavior)을 가지고 다른 객체와 상호작용을 합니다.

어렵게 느껴지죠. 한번 생활 속에서 객체를 찾아봅시다.

 

우리는 수업을 들으러 버스를 타고 학교를 갑니다.

여기서 간단하게 객체를 보면 우리(학생), 학교 ,수업, 버스라고 할 수 있겠네요

여기서 클래스라는 개념이 나옵니다

 

클래스

클래스는 객체의 설계도 라고 생각하시면 편합니다.

붕어빵으로 예시를 들면 붕어빵틀(클래스) → 붕어빵(객체)

 

즉 클래스는 객체의 속성(특성)과 기능(행동)을 코드로 구현한 것입니다.

코드로 구현하는 법을간단하게 나타내면 

(접근 제어자) class 클래스이름 {
	멤버 변수;
    메서드;
}

 

한번 학생객체로 생각해보죠

클래스의 이름은 Student으로 하고

studentId, name,grade, major와 같이 속성을 클래스 내부에 변수로 선언합니다.

이렇게 선언하는 클래스 속성을 '멤버 변수'라고 합니다.

 

public class Student{

	int studentId; //학번
    String name;
    int grade;
    String major;
}

 

그리고 객체에는 속성(특성)와 기능(행동)이 있다했습니다. 

즉 클래스에서도 객체가 가지는 속성을 사용해서 객체와 관련된 기능을 구현할 수 있습니다 

 

메서드

메서드는 멤버 함수라고도 불리며 클래스 내부에서 멤버 변수를 사용하여 클래스 기능을 구현한 것입니다.

방금 만든 학생클래스에서 학번을 대답을 하는 메서드를 한번 만들어 보겠습니다.

 

public class Student{

	int studentId; //학번
    String name;
    int grade;
    String major;
    
    public void showID(){
    System.out.println("제학번은 " + studentId +"입니다.");
    }
}

학생클래스에 학번을 말하는 메서드를 추가해봤습니다

 

 

5) 함수

메서드는 함수의 한종류입니다. 함수에 대해서 배워보겠습니다. 

 

함수

함수는 '하나의 기능을 수행하기 위한 일련의 코드'입니다 

즉 어떤 기능을 수행하도록 미리 구현해 놓고 필요할때마다 호출하여 사용할 수 있습니다.

 

함수는 이름이 존재하고 입력 값과 결과 값을 가질수 있습니다.

 

함수 정의

함수반환형 함수이름 (입력값1...){  //입력값1 이라고 했지만 매개변수라고합니다
	기능;
    return 반환값;
}

지금까지 예시코드에서 나누기(예외처리)와 같이 다 함수로 제작해서 예시를 보여드렸었습니다.

 

간단하게 함수에 대표적인 4가지예시를 보여드리고 마무리 지어보겠습니다

대략 4가지 경우가 있겠네요

  1. 입력값 O 반환값 O
  2. 입력값 O 반환값 X
  3. 입력값 X 반환값 O 
  4. 입력값 X 반환값 X
//1 입력값 O 반환값 O
int add(int a, int b){ //입력을 정수형으로 a,b로 받아옴
return a+b; //정수형 a+b를 결과값 반환
}

//2 입력값 O 반환값 X
void showA(String a){
System.out.println("너는"+a+"같아"); //반환값 없음
}
//3 입력값 X 반환값 O 
int get1(){
return 1;//입력값을 받지않고 1을 반환
}
//4 입력값 X 반환값 X
void show(){
System.out.println("너는 바보같아"); //반환값 없음
}

 

실전문제

다음 main에 있는 함수가 원하는 결과값이 출력되도록 제작하시오.

//아래의 결과값을 출력하는 함수를 제작하시오
public static 함수반환형 함수이름( ) {

}

public static void main(String[] args){
showadd(7, 8); //반환된 값 없음
}

 

출력결과

7+8=15입니다

 

6) 객체와 클래스(2)

너무 많죠 이제는 좀 빠르게 잡설은 각설하고 진행 해보겠습니다.

이번 파트에 배워볼 내용은 딱 2가지입니다.

생성자, this

빠르게 코드로 진행해 보겠습니다.

 

생성자

클래스를 제작을 했으니까 다른 곳에서도 만든 클래스를 이용해서 객체를 생성해야겠죠

생성자는 클래스에 아무 생성자를 작성하지 않으면 디폴트 생성자를 자동으로 제작해줍니다

package likelion; 

public class Person{
	int age;
    String name;
}
//----
package likelion;
public class constructortest{
	public static void main(String[] args){
    Person p1 = new Person() ; //Person() -> 생성자 
    }
}

생성자에 직접 매개변수를 넣어 객체를 생성하기 위해서는 직접 생성자를 제작해야합니다.

직접 생성자를 제작하면 디폴트 생성자는 자동으로 생성이 되지않기때문에 

디폴트 생성자도 제작을 해보겠습니다.

package likelion; 

public class Person{
	int age;
    String name;
    
    public Person(){} //디폴트 생성자
    //아래 생성자를 제작후에 디폴트 생성자를 제거후 다시 코드를 실행해보세요
    public Person(String name,int age){
    	this.name = name;
        this.age = age;
    }
}
//----
package likelion;
public class constructortest{
	public static void main(String[] args){
    Person p1 = new Person("도히",99);
    Person p2 = new Person();
    }
}
Q.생성자의 클래스랑 이름이 똑같아요 그리고 2개의 생성자가 이름이 동일해도 되나요?
A. 우선 생성자는 클래스의 이름과 동일하게 합니다.
또한 메소드의 이름은 동일하고 받는 입력값의 갯수와 타입이 다를 경우 맞는 메소드로 자동으로 들어갑니다
이를 오버로딩이라고 합니다.  따라서 위에 코드에서는 생성자가 같은 이름으로 2개가 존재할 수 있습니다.

this

간단하게 설명하면 생성된 인스턴스 스스로를 가리키는 예약어입니다.

즉 위에 예시에서

  this.name = name;

이부분은 Person으로 생성된 객체의 name에 입력값 name을 넣겠다 라는 의미입니다

즉 p1.name = name; 과 같은겁니다 

this는 자기 자신을 가리킨다라고 생각하시면 편합니다

   


     

7) 접근제어

 

접근 제어자(access modifier)

멤버 또는 클래스에 사용되어서 외부로부터의 접근을 제한하는 역할을 한다.

접근 제어자를 이용하는 대표적으로 2가지가 있다.

  • 외부로부터 데이터를 보호하기위함
  • 외부에는 불필요한(내부적으로만 사용되는) 부분을 감추기 위함

접근제어자의 종류

  • private - 같은 클래스 내에서만 접근
  • default - 같은 패키지에서만 가능
  • protected - 같은 패키지 내에서, 그리고 다른 패키지의 자손클래스에서 접근가능
  • public - 어디에서든 접근 가능
//대표적인 사용
class Test {
    private int age; // 클래스에서만 접근가능
    private String name;

    public Test(int age, String name) {
        this.age = age;
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

public class Main {
    public static void main(String[] args) {
        Test t = new Test(1, "나비");
        t.setName("고양이");//직접 이름에 접근이 힘들어서 메소드를 통해 접근
        System.out.println(t.getName());
    }
}

 

 

지금 까지 배운걸 한번 한번에 풀어 보겠습니다

실전문제 

여기서 나온 Member class를 제작해보시오.

import java.util.ArrayList; 

public class likelionArray{
	public static void main(String[] args){
    	ArrayList<Member> euljiLion = new ArrayList<Member>();
        
        euljiLion.add(new Member("아무개","백엔드"));
        euljiLion.add(new Member("배고파","프론트엔드"));
        euljiLion.add(new Member("도히","기획디자인"));
        
        for(int i=0; i<euljiLion.size(); i++){
        Member member = euljiLion.get(i);
        member.showname(); //출력값 : 이름은 xxx 입니다
        }
      }
    }

 

출력결과

이름은 아무개 입니다
이름은 배고파 입니다
이름은 도히 입니다

 

지금까지 배운 내용들이 어렵다면 언제나 세션중에 질문하셔도 괜찮습니다:)

 

참고로 상속과 인터페이스 부분은 광범위해서 여러분의 공부양이 한주에 너무 많을 것같아서 따로 적지 않았지만

extend, super가 무엇이고 어떻게 사용하는지 정도는 알아주셨으면 좋겠습니다:) 

또한 상속과 인터페이스에 대해서는 세션도중에 배워나갈 예정이라 적지는 않았습니다.

만약에 많은 분들이 요청이 많다면 추가로 적도록 하겠습니다 1주차 세션 준비하느라 고생많으셨습니다.

 

 

추가적으로 마지막 실전문제 예시정답입니다 


이 글은 을지대학교 백엔드 세션 강의를 위해 제작된 게시글입니다 
언제나 조언부탁드립니다

728x90

댓글