Java/자바 알아두면 좋은 내용

자바 꿀팁.

Razelo 2020. 11. 19. 17:24

자바에서는 문자를 비교할 때 ==을 쓰면 주소를 비교하지만

mysql 다운받을때 mysql for excel을 체크해서 다운받아야만 엑셀 파일 읽을 수가 있다.

JDBC 프로그래밍 WITH MYSQL

2020.11.06
자바 jdbc프로그래밍할때 mysql 연동해주는데. mysql 한동안 사용안하다가 사용하니까
연결할 수 없음. cannot connect to server가 떴음. 그냥 서비스에서 mysql80 다시 시작하기 눌러도 서비스 재시작할 수 없음이라고 뜸.
인터넷에 검색하니까. 이게 mysql 프로세스를 강제종료를 자주 했을때 발생하는 현상이라고 함. 혹은 이 문제이거나 아니면 my.ini 파일이 손상되었을때 발생한다고 함.
my.ini 파일과 관련된 해결방법은 1. my.ini파일이 utf-8로 변환되있을 수 있는데. 이걸 ANSI로 다시 바꿔주는 방법이 있음. --> 근데 사실 이거 효과없었음. 그냥 뻘짓.

그리고 두번째는 그냥 MYSQL 새로 다시 재설치하는 방법임. 근데 이때 PROGRAM DATA에 있는 MYSQL에 테이블 즉 테이터에 대한 정보가 저장되어있는 파일이 있는데, 이건 남겨놓는 걸 추천함.
아니 그냥 PROGRAM DATA에 있는 MYSQL은 다른 곳에 복사해두셈.

그리고 재설치하면 my.ini 파일도 같이 새로 생성하는데, 이걸 복사해뒀던 mysql폴더 (아까 program data에서 복사해둔거) 그 안에 새로 덮어 넣어서 다시 program data에 넣어보셈.
그럼 될거임.

즉 my.ini파일은 새걸로 바꿔주고, 데이터파일(테이블) 파일은 원래 있던거 유지하는 방법임.

결론: 그냥 ini파일은 열어보지를 말자. 여는 순간 파일 인코딩 변함.
mysql 프로세스는 강제종료 시키지 말자. 안쓸거면 그냥 상태를 stopped로 해놓자.


자바에서는 문자를 비교할 때 ==을 쓰면 주소를 비교하지만
equals()를 쓰면 값을 비교한다.


자바 gui프로그래밍에서 System.exit(0)
을 하면 열려있는 창 전부가 닫히는데,
dispose()를 하면 이게 선언되있는 그 창만 닫힌다. 나머지는 그래도 열려있다.


String 변수 생성시 주소할당
String변수를 생성할때는 두가지 방법이 있습니다.

  1. 리터럴을 이용한 방식
  2. new 연산자를 이용한 방식

위의 두 가지 방식에는 큰 차이점이 있습니다. 리터럴을 사용하게 되면 string constant pool이라는 영역에 존재하게 되고 new를 통해 String을 생성하면 Heap 영역에 존재하게 됩니다. String을 리터럴로 선언할 경우 내부적으로 String의 intern() 메서드가 호출되게 됩니다. intern() 메서드는 주어진 문자열이 string constant pool에 존재하는지 검색하고 있다면 그 주소값을 반환하고 없다면 string constant pool에 넣고 새로운 주소값을 반환합니다.

주소값 비교(==)와 값 비교(equals)

==연산자와 String클래스의 equals()메소드의 가장 큰 차이점은 == 연산자는 비교하고자 하는 두개의 대상의 주소값을 비교하는데 반해 String클래스의 equals 메소드는 비교하고자 하는 두개의 대상의 값 자체를 비교합니다. 일반적인 타입들 int형, char형등은 Call by Value 형태로 기본적으로 대상에 주소값을 가지지 않는 형태로 사용됩니다. 하지만 String은 일반적인 타입이 아니라 클래스입니다. 클래스는 기본적으로 Call by Reference형태로 생성 시 주소값이 부여됩니다. 그렇기에 String타입을 선언했을때는 같은 값을 부여하더라도 서로간의 주소값이 다를 수가 있습니다.

문자열 비교 (==연산자)

public class compare {
    public static void main(String[] args) {
        String s1 = "abcd";
        String s2 = new String("abcd");

        if(s1 == s2) {
            System.out.println("두개의 값이 같습니다.");
        }else {
            System.out.println("두개의 값이 같지 않습니다.");
        }
    }
}

== 연산자의 경우 객체의 주소값을 비교하기 때문에 일반 객체처럼 Heap 영역에 생성된 String 객체와 리터럴을 이용해 string constant pool에 저장된 String 객체의 주소값은 다를 수밖에 없습니다. 그러므로 두개의 값은 서로 다르다는 결론이 나오게 됩니다. 이러한 경우가 발생할 수 있기에 자바에서 문자열을 비교하려면 equals라는 메서드를 활용하여 두개의 값을 비교해주어야 합니다.

문자열 비교 (equals메서드)

public class compare {
    public static void main(String[] args) {
        String s1 = "abcd";
        String s2 = new String("abcd");

        if(s1.equals(s2)) {
            System.out.println("두개의 값이 같습니다.");
        }else {
            System.out.println("두개의 값이 같지 않습니다.");
        }
    }
}

String 클래스안에 있는 equals라는 메서드를 사용하면 두 비교대상의 주소 값이 아닌 데이터값을 비교하기 때문에 어떻게 String을 생성하느냐에 따라 결과가 달라지지 않고 정확한 비교를 할 수 있습니다.


스윙 백그라운드 이미지 삽입하기

import java.awt.event.*;
import javax.swing.*;
import java.awt.*;

public class back extends JFrame {
    JScrollPane scrollPane;
    ImageIcon icon;

    public back() {
        icon = new ImageIcon("c:\\back.jpg");

        //배경 Panel 생성후 컨텐츠페인으로 지정      
        JPanel background = new JPanel() {
            public void paintComponent(Graphics g) {
                // Approach 1: Dispaly image at at full size
                g.drawImage(icon.getImage(), 0, 0, null);
                // Approach 2: Scale image to size of component
                // Dimension d = getSize();
                // g.drawImage(icon.getImage(), 0, 0, d.width, d.height, null);
                // Approach 3: Fix the image position in the scroll pane
                // Point p = scrollPane.getViewport().getViewPosition();
                // g.drawImage(icon.getImage(), p.x, p.y, null);
                setOpaque(false); //그림을 표시하게 설정,투명하게 조절
                super.paintComponent(g);
            }
        };



        JButton button = new JButton("버튼");
        background.add(button);
        scrollPane = new JScrollPane(background);
        setContentPane(scrollPane);
    }

    public static void main(String[] args) {
        back frame = new back();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(300, 300);
        frame.setVisible(true);
    }
}
[출처] [Java] 스윙 그래픽 - 프레임에 배경이미지 넣기 |작성자 자바킹

스윙 스크롤 달기

import java.awt.BorderLayout;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.ScrollPaneConstants;

public class Layout {
    public static void main(String[] args) {
        JFrame frame = new JFrame("Test");
        JPanel panel = new JPanel();

        JTextArea txt  = new JTextArea(10,20);
        JScrollPane scroll = new JScrollPane(txt);

        scroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
        scroll.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        panel.add(scroll);


        frame.getContentPane().add(BorderLayout.CENTER,panel);


        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(300, 200);
        frame.setVisible(true);
    }
}


출처: https://spoiler.tistory.com/86 [WOOHU]

자바에서 URL 연결하기

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.awt.Desktop;

public class Web {
    public static void main(String [] args){
        try {
            Desktop.getDesktop().browse(new URI("http://mdago.tistory.com/"));
        } catch (IOException e) {
            e.printStackTrace();
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }
    }
}


출처: https://mdago.tistory.com/2 [MDaGO]

//원본 문자열에 특정 단어가 몇 개 있는지 분석 예

import java.util.Scanner;

public class Program {

        static Scanner scanner = new Scanner(System.in);

        public static void main(String[] args){

               String origin = "";

               System.out.println("원본 문자열 입력:");

               origin = scanner.nextLine();



               String word="";

               System.out.println("검색할 단어 입력:");

               word = scanner.next();



               System.out.println("원본:"+origin);

               System.out.println("검색할 단어:"+word);



               String[] sarr = origin.split(" ");



               int len = sarr.length;

               int count = 0;

               for(int i = 0; i<len; i++){

                       if(word.equals(sarr[i])){

                              count++;

                       }

               }

               System.out.println("빈도수:"+count);

        }

}



출처: https://ehclub.net/525 [프로그램 소스]
//프레임바 자바 이모티콘 말고, 원하는 이미지로 지정함. 
        ImageIcon img = new ImageIcon("C:\\Users\\user\\Desktop\\java\\corona\\src\\images2\\covid.jpg");
        setIconImage(img.getImage());
반응형