반응형

 

전자공학을 전공하다가 프로그래밍에 흥미를 느끼게 된 나.. 근데, 생각보다 실력이 늘지 않아서 작심삼일을 거듭했다. 

그 유명한 김영한 선생님의 인프런 강의도 결국 80%를 채우고 손을 놓았는데.. 음... 역시 국비교육을 들으면서 개인 프로젝트 + 취준 (원서 73개 냈음)을 병행하는 건 무리였다. 결국 2023 하반기 취업에 성공을 못했다.

 

서류 합격을 했으나 코테 합격률은 0%.... 코테 보면 항상 0솔 하거나, 겨우 1솔~ 2솔에 머무는 수준이었다. 내가 좀 심각하구나..를 느끼며, 개인 프로젝트와 코테를 병행해야겠다고 생각했고, 비교적 난이도가 쉬운 홍팍시리즈를 선택하게 됐다.

 

내돈 내산이며, 이 책을 기점으로 꼭 취업할 수 있길 바란다!!

 

화이팅~~

 

https://www.yes24.com/Product/Goods/119952151

 

코딩 자율학습 스프링 부트 3 자바 백엔드 개발 입문 - 예스24

스프링 부트 백엔드 개발,실습 문턱을 낮추고 자신 있게 시작하자!스프링 부트를 처음 접하는 입문자와 이미 공부했지만 부족하다고 느끼는 분들을 위한 책입니다. 게시판을 만들며 클라이언트

www.yes24.com

 

반응형
반응형

자바를 공부하다 보면 헷갈리는 용어가 많은데, 특히 오버로딩(Overloading)과 오버라이딩(Overriding)이 비슷해서 많이 헷갈린다. 그런데, 사실 둘은 아무 관계 없는 내용이다. 둘의 차이점을 알아보자.

 

  오버로딩(Overloading) 오버라이딩(Overriding)
접근 제어 달라도 됨 같음
반환형 달라도 됨 같음
메서드 이름 같음 같음
매개변수 달라도 됨 같음

 

1. 오버로딩(Overloading)

같은 클래스 내에서 매소드를 확장하기 위한 것. 메소드 명은 같지만, 매개 변수, 반환형 등을 다르게 하여 편리하게 사용 가능하다.

  • 메서드 이름이 같다.
  • 매개 변수, 반환형(return)은 달라도 된다. 
  • 같은 클래스 내에 선언 되어야 한다.
  • 만약 매개 변수의 개수가 같다면 자료형이 달라야 하고, 자료형이 모두 같다면 매개 변수의 개수를 다르게 해야 한다.

코드 예시를 통해 개념을 익혀보자.

class Hello {
    void overL() {
        System.out.println("오버로딩을 위한 메서드");
    }

    void overL(String str){
        System.out.println("매개 변수 타입이 String 이고, 값은 " + str);
    }

    void overL(int k){
        System.out.println("매개 변수 타입이 int 이고, 값은 " + k);
    }

    int overL(int x, int y){
        System.out.println("반환형이 다른 메서드");
        return x;
    }
}


public class HelloJava {
    public static void main(String[] args) {

        Hello ov = new Hello();

        ov.overL();
        ov.overL("오버로딩 예제");
        int num = ov.overL(5, 6);
        System.out.println(num);

    }
}

 

2. 오버라이딩(Overriding)

부모 클래스의 메서드를 자식 클래스에서 메서드를 '재정의'하는 것이다. 

  • 메서드 명, 매개 변수, 반환형, 접근 제어자가 모두 같다.
  • 상속 받은 부모 클래스의 메서드를 재정의 하는 것이다. 다른 클래스의 메서드를 재정의 하는 것이 아니다!
class Animal {
    public void makeSound() {
        System.out.println("동물이 소리를 내고 있습니다.");
    }
}

class Dog extends Animal {
    @Override
    public void makeSound() {
        System.out.println("강아지가 멍멍 소리를 내고 있습니다.");
    }
}

public class HelloJava {
    public static void main(String[] args) {
        Animal animal = new Animal();
        Dog dog = new Dog();

        animal.makeSound(); // "동물이 소리를 내고 있습니다." 출력
        dog.makeSound();    // "강아지가 멍멍 소리를 내고 있습니다." 출력

    }
}

 

반응형
반응형

추상클래스란?

1. 추상 메소드와 완성된 메소드로 구성되어 있는 클래스.
 
2. 추상 메소드(Abstract Method)선언부만 존재하며, 구현부 {}는 존재하지 않는다.
 
3. 만약 main 함수에서 추상 클래스 자료형의 객체를 생성하려면, 상속 클래스를 통해 추상 메소드를 구현(구현부를 작성)을 해야 한다.
 
4. 추상 클래스를 상속받은 클래스는 추상 클래스에 있는 추상 메소드를 구현해줘야한다. 단, 상속 받은 클래스가 추상 클래스일 경우에는 모든 추상 메소드를 구현하지 않아도 된다.

우선 첫 번쨰와 두 번째 정의를 살펴보자.

 

1. 추상 메소드와 완성된 메소드로 구성되어 있는 클래스.

2. 추상 메소드(Abstract Method)는 선언부만 존재하며구현부 {}는 존재하지 않는다.

초록색 네모 안에는 class 앞에 abstract를 사용하여 추상 클래스임을 확인할 수 있다.

빨간색 네모 안에 있는 abstract void move(int x, int y);는 여타 메소드와는 다르게 구현부 {}, 중괄호로 되어 있는 부분이 없다. 이런 메소드를 추상 메소드라고 불리며, 껍데기만 있다고 표현할 수 있다.

검은 네모 안에 있는 메소드는 흔히 볼 수 있는 메소드이다. 선언부에 void stop()이 있고, 구현부에는 값을 출력하는 것을 보이고 있다.

이처럼 추상 클래스는 클래스 내에 추상 메소드, 일반 메소드가 모두 존재할 수 있다. 하지만, 인터페이스는 무조건 추상 메소드만 있어야 한다는 것이 추상 클래스와의 차이점이다.

 

3. 만약 main 함수에서 추상 클래스 자료형의 객체를 생성하려면상속 클래스를 통해 추상 메소드를 구현(구현부를 작성)을 해야 한다.

abstract class Unit {       // 추상 클래스에는 일반 메서드도 포함. 인터페이스는 무조건 추상메서드
    int x, y;
    abstract void move(int x, int y);
    void stop() {/* 현재 위치에 정지 */}
}

class Marine extends Unit {
    void move(int x, int y){
        System.out.println("Marine[ x = " + x + ", y = " + y + "]");
    }
}

class Tank extends Unit {
    void move(int x, int y){
        System.out.println("Tank[ x = " + x + ", y = " + y + "]");
    }
}   

class Dropship extends Unit {
    void move(int x, int y) {
        System.out.println("Dropship[ x = " + x + ", y = " + y + "]");
    }
}

public class Abstract3 {
    public static void main(String args[]){
//      Unit[] group = {new Marine(), new Dropship(), new Tank()}; 아래 세 줄을 한 줄로 줄인 것   // 추상 클래스 객체를 만드는 건 불가능. 왜냐면 추상 클래스에는 추상 메서드가 있을 수 있기 때문. 그래서 상속받은 클래스 형으로 객체를 생성해야 함.
        Unit[] group = new Unit[3];
        group[0] = new Marine();
        group[1] = new Dropship();
        group[2] = new Tank();
    
        group[0].move(100, 200);
        group[1].move(100, 200);
        group[2].move(100, 200);

    }
}

 

우측이 추상 클래스, 좌측이 추상 클래스를 상속받은 Marine, Tank, Dropship 클래스

Unit 이라는 추상 클래스를 상속 받은 Marine, Tank, Dropship 클래스들은 추상 메서드인 abstract void move(int x, int y);를 구현(완성)하고 있는 것을 확인할 수 있다. 만약 Unit 추상 클래스를 상속받은 일반 클래스에서, move 메서드를 구현하지 않았다면 컴파일러에서 에러를 발견하여 빨간 줄이 뜨는 걸 볼 수 있다. 이렇게 추상 매서드를 구현해야 main에서 Unit 객체를 생성할 수 있다.

 

이렇듯, 여러 클래스에 공통적으로 사용될 수 있는 추상 클래스를 바로 작성하거나 기존 클래스의 공통 부분을 뽑아서 추상 클래스를 만들 수 있다.

 

(참고, Marine, Tank, Dropship 객체를 생성하되 참조변수는 Unit 으로 선언할 수 있다. 왜냐하면 상속 받았기 때문!

 

ex) Unit[] group = new Unit[3]; 

Unit[] group = new Marine[3];

Unit[] group = new Tank[3];

Unit[] group = new Dropship[3] ;

 

하지만 Marine 객체를 선언하면 Marine 클래스 내에 있는 메소드와 상속 받은 Unit 클래스 내에 있는 메소드만 사용 가능하다. 나머지도 동일!)

 

4. 추상 클래스를 상속받은 클래스는 추상 클래스에 있는 추상 메소드를 구현해줘야한다. 단, 상속 받은 클래스가 추상 클래스일 경우에는 모든 추상 메소드를 구현하지 않아도 된다.

 

이게 무슨 뜻인지 아래 코드를 보며 이해해보자.

 

좌측이 추상 클래스, 우측이 Marine 클래스

추상 클래스 Unit에는 세 가지의 메서드가 있다.

abstact void move, abstract void fly, void stop.

 

<만약 main 함수에서 추상 클래스 자료형의 객체를 생성하려면상속 클래스를 통해 추상 메소드를 구현(구현부를 작성)을 해야 한다>라는 3번의 정의에 따르면,  현재 Marine 클래스에는 move 메서드는 구현했지만 fly 메서드는 구현하지 않았다. 그래서 빨간 줄이 나오는 것을 볼 수 있다. 

 

하지만, 여기서 Marine 클래스를 추상 클래스로 선언한다면, 굳이 모든 추상 메서드를 구현할 필요가 없어진다.

반응형
반응형

--<백준 2562번 :: 최댓값 - JAVA>--


이문제도 굉장히 쉬운 문제이다. 배열과 배열의 인덱스만 이해한다면 1분조차 안걸려서 풀 수 있다.

그러나... 처음 알고리즘을 공부하거나 배열에 익숙하지 않는다면 조금 힘들 수 있다!! 

괜찮다. 지금부터 배우면 되니까.

나도 완벽하지 않은데 누굴 가르치겠냐만은... 같이 공부하는 느낌으로 해보는 거다!

 

 

1. 배열을 사용하면 쉽게 해결!

import java.util.Scanner;

public class Main{
    public static void main(String[] args){
        
        Scanner input = new Scanner(System.in);

        int[] array = new int[9];
        int max = 0;
        int index = 0;;

        for(int i = 0; i < array.length; i++){
            array[i] = input.nextInt();
            if(array[i] > max){
                max = array[i];
                index = i;
            }    
        }

        System.out.println(max);
        System.out.println(index + 1);
    }
}

여기서 마지막에 index + 1을 출력한 이유는, 배열의 번호는 0번부터 시작하기 때문이다.

문제의 출력 값을 보면 8번째의 수는 '8'번째의 위치에 있다고 했다. 만약 index를 그대로 출력했다면 7이 나왔을 것이다.

 

알고리즘 공부하는 모두들 화이팅!

반응형
반응형

--<백준 2475번 :: 검증수 - JAVA>--


이번 문제는 아주 간단한 문제입니다. 평소보다 문제의 길이는 길지만(?) 쉬운 알고리즘으로 풀 수 있습니다. 물론 처음 알고리즘 공부를 했을 때는 이것조차 버거웠죠.. 알고리즘 실력은 하루이틀만에 늘어나는 것이 아니니까, 차근차근 다같이 공부해봅시다.

 

import java.util.Scanner;

public class Main{
    public static void main(String[] args){
        
        Scanner input = new Scanner(System.in);

        int[] arr = new int[5];
        int cnt = 0;
        int result;

        for(int i = 0; i < arr.length; i++){
            arr[i] = input.nextInt();
            cnt = cnt + arr[i]*arr[i];
        }

        result = cnt % 10;  
        System.out.println(result);

    }
}

입력 값을 int형으로 받을 배열을 선언하고, for문에서 입력값을 받습니다. 그리고 그 값들을 제곱한 값을 cnt에 저장하고, 나중에 10으로 나눈 값을 result에 저장합니다.

간단하죠??

 

알고리즘 공부하시는 여러분, 항상 화이팅입니다!!

반응형
반응형

--<백준 1157번 :: 단어 공부 - JAVA>--


알고리즘 공부를 조금씩 하다 보니 생긴 요령이 있습니다. 영어를 앞으로 밀거나, 비교하거나, 바꾸는 경우 항상 '아스키코드'를 사용하는 것이 편리하다는 것이죠! 이번 문제도 아스키코드를 사용하여 간단하게 풀어보았습니다. 

어려운 부분은 없으니 천천히 따라오시면 됩니다!

 

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		
		Scanner input = new Scanner(System.in);
		
		int[] arr = new int[26];
		String s = input.next();
		
		for(int i = 0; i < s.length(); i++) {
			
			if(65 <= s.charAt(i) && s.charAt(i) <= 90) { // 대문자인 경우
				arr[s.charAt(i)-65]++;
			}
			else { // 소문자
				arr[s.charAt(i)-97]++;
			}
		}
		
		int max = -1;
		char ch = '?';
		
		for(int j = 0; j < 26; j++) {
			if(max < arr[j]) {
				max = arr[j];
				ch = (char)(j + 65);
			}
			else if(max == arr[j]) {
				ch = '?';
			}
		}
		
		System.out.print(ch);
	}
}

아스키코드를 참고해서 만들었습니다. 그런데 만들고보니, 다른 분과 완전 똑같게 했더라구요...

마 쉬운 문제라서 겹치는 답이지 않을까 싶습니다!!

 

알고리즘 공부하시는 분들 모두 화이팅~~

반응형
반응형

--<백준 1152번 :: 단어의 개수 - JAVA>--


총 두 가지 방법으로 풀었습니다.

 

1. StringTokenizer를 사용하는 방법

2. charAt을 사용하는 방법

 

다른 블로그를 보니까 대부분 StringTokenizer를 사용하셨더라고요! 당연히 StringTokenizer 클래스가 간단하죠. 그러나 알고리즘에 대해 아직까지는 노가다가 더 편한 저는... charAt으로도 해봤습니다. 막상 풀어보니 메모리와 시간은 비슷하더라고요! 위에가 charAt, 아래가 StringToknizer 입니다!

천천히 파헤쳐보겠습니다~

 

 


1. StringTokenizer를 활용한 자바 코드

import java.util.StringTokenizer;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		
		Scanner str = new Scanner(System.in);
		
		String s = str.nextLine();
		str.close();
		
		StringTokenizer st = new StringTokenizer(s, " ");
		
		System.out.println(st.countTokens());
	}
}

완전 간단하죠~? StringTokenizer가 띄어쓰기를 기준으로 단어를 분류하고, 그 분류된 단어들을 토큰이라고 합니다.

그 토큰의 개수만 출력해주면 바로 해결!

 


이번엔 charAt을 사용한 방법을 보여드리겠습니다.

 

2. charAt을 사용한 방법

import java.util.Scanner;

public class Main{
    public static void main(String[] args){
        
        Scanner input = new Scanner(System.in);
        String str;
        int cnt = 0;

        str = input.nextLine();

        for(int j = 0; j < str.length(); j ++){	//우선 공백의 개수를 먼저 세아린다
            if(str.charAt(j) == ' '){
                cnt++;
            }
        }

        if(str.charAt(0) != ' ' && str.charAt(str.length()-1) != ' '){ //첫 번째와 마지막이 공백이 아닌 경우
            cnt = cnt + 1; 
        }
        if(str.charAt(0) == ' ' && str.charAt(str.length()-1) == ' '){ //첫 번째와 마지막이 공백인 경우
            cnt = cnt - 1;
        }
        System.out.println(cnt);
        
    }
}

어떤 알고리즘인지 감이 오시나요??

 

아래 그림처럼 이해하면 쉽습니다!

 

우선 for문을 사용하여 공백의 개수를 cnt에 입력합니다.

 

그리고 

 

case1. 가장 첫 번째와 마지막이 공백이 아닌 경우 -> cnt = cnt + 1

case2. 가장 첫 번째와 마지막 중에서 하나만 공백인 경우 -> cnt 변화 없음

case3. 가장 첫 번째와 마지막이 모두 공백인 경우 -> cnt = cnt - 1

 

이렇게 예를 들어서 하면 쉽게 이해가 됩니다!

 

아직은 어려운 알고리즘은 아니어서 이렇게 노가다로 풀지만.... 코딩테스트나 프로그래머스에 나오는 문제들은 노가다로는 절대 안 풀리더라고요.. 하하  

 

코딩러들 다들 화이팅~!

 

반응형
반응형

과거에는 java를 다루기 위해 eclipse, VsCode를 많이 사용했었다. 최근에는 더 다양한 언어를 한꺼번에 쉽고 간단하게 다룰 수 있도록 나온 Intellij를 많이 사용하는 추세이다. 또한 Intellij는 Android Studio와 흡사하며(Android Studio가 Intellij와 흡사하다고 표현하는 게 맞을 듯) Github에 push and commit도 간단하게 할 수 있다는 장점이 있다.

우선 Intellij에 Java 세팅을 하기 전에 java JDK를 다운받고 환경변수를 설정해보자.

 

 

Java jdk1.8 다운로드 하기

출처 : oracle

 

 

우선 jdk 1.8버젼을 다운로드 해보겠습니다.

아래 링크로 들어가셔서 스크롤을 내리면 아래 이미지처럼 나오는데, 내 컴퓨터의 OS에 맞는 환경의 jdk를 다운받아주시면 됩니다.

https://www.oracle.com/java/technologies/javase/javase-jdk8-download.html

 

 

잘 모르시겠다면 윈도우(맥북아님)를 쓰실 가능성이 높기 때문에 가장 아래에 있는 Windows x64를 다운받아 주시면 됩니다.

 

 

여기서 Windows x86은 32비트, Windows x64는 65비트를 말합니다. 자신의 컴퓨터가 몇 비트인지 확인하고 싶다면 아래 링크를 확인해주시기 바랍니다.

https://codingbuza.tistory.com/2

 

컴퓨터 32비트 64비트 확인하는 방법

내 컴퓨터는 32비트 일까 64비트 일까? 내 컴퓨터 - 우클릭 - 속성 32비트(x86) or 64비트(x64) 확인 참 쉽쥬?

codingbuza.tistory.com

 

 

다운로드가 끝났다면 jdk가 잘 다운로드되었는지 확인하는 과정이 필요합니다. 우선 명령프롬포트(cmd)를 열어줍니다. 여는 방법은 <윈도우키 + S> 혹은 <윈도우키 + R>을 누르고 cmd라고 검색한 다음 엔터를 눌러주시면 됩니다.

자, 명령 프롬포트를 실행했습니다.

 

 

실행했다면 아래와 같이 <java -version>라고 입력합니다.

 

java -version

 

그러면 아래와 같이 현재 설치된 jdk의 정보가 나옵니다. 아래처럼 뜨면 성공입니다! 여기서는 제가 1.8버젼을 다운받았기 때문에 1.8이라고 뜨는 겁니다.

 

이렇게 java jdk의 설치는 끝났습니다. 이제 환경변수 설정을 해봅시다.

 

 

환경 변수 설정 하기

    윈도우키 + S -> 환경 변수

 

<윈도우 + S> 를 누른 뒤에 <환경 변수>라고 검색하면 아래와 같이 메뉴가 나옵니다. 시스템 환경 변수 편집을 눌러줍시다. 여기서 주의할 점은 <환경변수>에서 띄어쓰기를 반드시 해주셔야 합니다.

 

 

<시스템 속성>에서 가장 아래에 보이는 환경 변수를 눌러줍니다.

  시스템 변수 - 새로 만들기

 

 

JAVA_HOME

 

변수 이름은 <JAVA_HOME>으로 지정하고 변수 값은 디렉터리 찾아보기를 눌러서 jdk 파일이 있는 곳을 지정해줍니다.

 

 

 

Path 편집

 

 

 

%JAVA_HOME%\bin 추가

이렇게 해서 환경변수 설정도 모두 끝났습니다!! 이젠 Intellij의 java 초기 설정을 해봅시다.

 

 

인텔리제이 다운로드 및 실행

우선 인텔리제이를 다운받기 위해서는 아래 링크로 들어가서 다운받으면 됩니다. 아래 링크는 인텔리제이 공식 홈페이지 입니다.

www.jetbrains.com

 

JetBrains: Essential tools for software developers and teams

JetBrains is a cutting-edge software vendor specializing in the creation of intelligent development tools, including IntelliJ IDEA – the leading Java IDE, and the Kotlin programming language.

www.jetbrains.com

 

 

인텔리제이를 다운받으셨다면 실행하고 프로젝트를 하나 만듭니다.

 

 

    File - Project Structure

 

 

 

처음 시작할 때는 Project SDK에 jdk가 잡혀있지 않은 경우가 있습니다. 이럴 때 옆에 Edit을 눌러서 jdk가 있는 폴더를 지정해주면 됩니다.

그리고 SDKs

그리고 SDKs에 jdk 1.8 version이 잘 들어가 있는지 확인합니다.

이렇게 되어있다면 성공입니다.

 

 

개발하는 것도 중요하지만 이렇게 개발 환경을 구축하는 것도 중요합니다. 처음에 잘해놓아야 다음번에 크게 신경 쓸 것이 없으니까요... 첫 단추를 잘못 꿰면 나중에 버젼이 안 맞아서 전부 다 갈아엎는 경우도 생깁니다. 모두 잘 풀리셨길 바라며 질문이 있으시면 언제든지 댓글 혹은 xhxkf0202@naver.com으로 보내주세요

 

감사합니다.

반응형

+ Recent posts